Как создать винтажные изображения в MATLAB?

Учитывая цветное изображение в качестве входных данных, я хотел бы наложить 3 изображения одинакового размера со следующими цветами: зеленый, черный и синий.

Для каждого из этих изображений я хотел бы изменить их непрозрачность:

  • Зеленый = 40%
  • Черный = 43%
  • Синий = 39%

Как только я создам эти изображения, я хотел бы, наконец, наложить исходное изображение с непрозрачностью 38%. Кто-нибудь может помочь? Я хотел бы взять исходное изображение и применить этот винтажный эффект с помощью MATLAB.


person angel    schedule 09.09.2014    source источник
comment
Вы пробовали что-нибудь?   -  person rayryeng    schedule 09.09.2014
comment
Я пытался, но с плохими результатами. Как вы думаете, моя идея получить винтажный образ таким образом возможна?   -  person angel    schedule 09.09.2014
comment
Я умею создавать винтажные образы, но не так, как вы спрашиваете. Я никогда не имел дело с винтажными изображениями, используя непрозрачность этих трех цветов. Я создал изображения винтаж/сепия, используя взвешенную комбинацию компонентов RGB для каждого канала. Вы хотите, чтобы я написал ответ своим методом?   -  person rayryeng    schedule 09.09.2014
comment
Да, я был бы признателен. :) Моя идея заключалась в том, чтобы создать такой же эффект с помощью инстаграма.   -  person angel    schedule 09.09.2014
comment
Круто :) Дайте мне один момент.   -  person rayryeng    schedule 09.09.2014


Ответы (1)


Я никогда не создавал эффекты сепии/винтажа на изображении, используя непрозрачность, о которой вы говорите. Что я обычно делаю для создания сепии/винтажных изображений, так это создание выходных красных, зеленых и синих компонентов, используя комбинацию красного, зеленого и синего каналов входного изображения.

Таким образом, вы создаете сепию / винтажные изображения, используя следующие уравнения. Предположим, что ваши красный, зеленый и синий каналы для входного изображения хранятся в inputRed, inputGreen и inputBlue соответственно. Вот уравнения, рекомендованные Microsoft:

outputRed = (inputRed * .393) + (inputGreen *.769) + (inputBlue * .189)
outputGreen = (inputRed * .349) + (inputGreen *.686) + (inputBlue * .168)
outputBlue = (inputRed * .272) + (inputGreen *.534) + (inputBlue * .131)

Источник: Технологическая Республика

outputRed, outputGreen, outputBlue — выходные цветовые каналы для сепии/винтажного изображения. Таким образом, просто прочитайте свое изображение, затем извлеките каждую из цветовых плоскостей, выполните эту взвешенную комбинацию для каждого из выходных цветовых каналов, затем объедините каналы вместе. Следует отметить, что когда вы читаете изображение, оно, скорее всего, будет иметь тип uint8. Чтобы сохранить точность при умножении с десятичными числами, вам нужно привести изображение к double, прежде чем продолжить. После того, как вы рассчитаете каналы сепии/винтажа, вам нужно будет преобразовать результат обратно в uint8, чтобы вы могли правильно отобразить изображение, а также сохранить его на диск. Таким образом, вот код:

im = double(imread('...')); % // Read in your image here
inputRed = im(:,:,1); %// Extract each colour plane
inputGreen = im(:,:,2);
inputBlue = im(:,:,3);

%// Create sepia tones for each channel
outputRed = (inputRed * .393) + (inputGreen *.769) + (inputBlue * .189);
outputGreen = (inputRed * .349) + (inputGreen *.686) + (inputBlue * .168);
outputBlue = (inputRed * .272) + (inputGreen *.534) + (inputBlue * .131);

%// Create output image by putting all of these back into a 3D matrix
%// and convert back to uint8
out = uint8(cat(3, outputRed, outputGreen, outputBlue));

figure;
imshow(im,[]); %// Show original image
figure;
imshow(out); %// Show sepia image

Обратите внимание, что для повторного создания трехмерной матрицы я использую cat, который объединяет массивы/матрицы в указанном измерении. Я указал третье измерение, так как мы хотим наложить красный, зеленый и синий каналы друг на друга, чтобы сформировать трехмерную матрицу. Затем я привел этот результат к uint8.


Вот пример. Я решил взять семейный портрет с сайта Jon Woodbury Photography. Тех, кто появляется здесь, я не знаю лично, но тем не менее спасибо, что разрешили использовать вашу фотографию :)

http://jonwoodburyphotography.com/blog/wp-content/gallery/12-best-family-portraits-of-2012/best-unique-family-portraits-utah-8544.jpg

Когда я загружаю это изображение, а затем запускаю код с этим изображением, я получаю следующий результат:

введите здесь описание изображения


Примечание — Эффективность

Приведенный выше код довольно много для ввода. Вы можете сделать это в две строки (три, если вы рассматриваете чтение изображения как шаг), если хотите, используя комбинацию permute и reshape< /а>. Вам нужно будет инкапсулировать коэффициенты сепии в 2D-матрицу, затем вы можете вычислить каждый выходной пиксель как умножение матрицы. В качестве таких:

im = double(imread('...')); %// Read in image
%// Define sepia matrix
M = [0.393 0.769 0.189; 0.349 0.686 0.168; 0.272 0.534 0.131];
out = uint8(reshape((M*reshape(permute(im, [3 1 2]), 3, [])).', ...
           [size(im,1) size(im,2), 3]));

Вы должны получить на выходе то же самое, что и в предыдущей версии кода! В качестве теста вы предоставили изображение в комментариях ниже:

Вот что я получаю, используя модифицированный код (на самом деле вы просто получите те же результаты, что и в первой версии кода):

введите здесь описание изображения

person rayryeng    schedule 09.09.2014
comment
@ангел - прости? Что бы вы хотели сделать с этим изображением? Хотите узнать, как выглядит этот винтаж? В любом случае, я сделал это для тебя. Проверьте мой отредактированный пост. - person rayryeng; 10.09.2014
comment
Между тем, спасибо за доступность. Я хотел бы применить эффекты, подобные изображению, которое я разместил. - person angel; 10.09.2014
comment
Позволь мне объяснить. а) i46.photobucket.com/albums/f137/thanhtu_zx/Untitled- 1.jpg б) i.ytimg.com/vi/14khxLI8j4U/maxresdefault .jpg Примите во внимание рисунок а) первую часть, например, для а1) я хотел бы применить фильтр как таковой к рисунку б). - person angel; 10.09.2014
comment
@angel - Этого я не могу воспроизвести. Это коммерческая тайна инстаграма, поэтому они зарабатывают на своем приложении :) Если бы был доступен точный алгоритм, то инстаграм бы не заработал :). Вот тут я не могу тебе помочь. Самое близкое к винтажу/сепии то, что я указал выше. Извиняюсь! Удачи кстати. - person rayryeng; 10.09.2014