如何在MATLAB中创建复古图像?

时间:2014-09-09 18:49:02

标签: image matlab image-processing

考虑到彩色图像作为输入,我想用以下颜色叠加3张相同尺寸的图像:绿色,黑色和蓝色。

对于每个图像,我想改变它们的不透明度:

  • 绿色= 40%
  • 黑= 43%
  • 蓝色= 39%

创建这些图像后,我希望最终覆盖输入图像的不透明度为38%。有人可以帮忙吗?我想拍摄原始图像并使用MATLAB应用这个老式效果。

1 个答案:

答案 0 :(得分:4)

我从来没有使用你所说的不透明度在图像上创建棕褐色/复古效果。我通常用来创建棕褐色/复古图像的方法是使用输入图像的红色,绿色和蓝色通道组合创建输出红色,绿色和蓝色组件。

如何以这种方式创建棕褐色/复古图像是使用以下等式。假设输入图像的红色,绿色和蓝色通道分别存储在inputRedinputGreeninputBlue中。这些是Microsoft推荐的公式:

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

来源:Tech Republic

outputRedoutputGreenoutputBlue是棕褐色/复古图像的输出颜色通道。因此,只需读入图像,然后提取每个颜色平面,为每个输出颜色通道执行此加权组合,然后将通道组合在一起。应该注意的是,当您在图像中读取时,这很可能是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

请注意,要再次创建3D矩阵,我使用cat连接指定维度中的数组/矩阵。我指定了第三个维度,因为我们希望将红色,绿色和蓝色通道堆叠在一起以形成3D矩阵。然后我将此结果转换为uint8


这是一个例子。我决定从Jon Woodbury Photography拍摄全家福。那些出现在这里的人我个人并不认识,但感谢让我使用你的照片:)

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

当我下载此图像时,请使用此图像运行代码,这是我得到的输出:

enter image description here


旁注 - 效率

输入上面的代码非常多。如果您希望使用permutereshape的组合,则可以分为两行(如果您考虑将图像作为一个步骤读取,则为三行)。您需要将sepia系数封装在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]));

您应该在输出中获得与之前版本的代码相同的内容!作为测试,您在下面的评论中提供了一个图像:

这是我使用修改后的代码所获得的(实际上,您只需获得与代码的第一个版本相同的结果):

enter image description here