考虑到彩色图像作为输入,我想用以下颜色叠加3张相同尺寸的图像:绿色,黑色和蓝色。
对于每个图像,我想改变它们的不透明度:
创建这些图像后,我希望最终覆盖输入图像的不透明度为38%。有人可以帮忙吗?我想拍摄原始图像并使用MATLAB应用这个老式效果。
答案 0 :(得分:4)
我从来没有使用你所说的不透明度在图像上创建棕褐色/复古效果。我通常用来创建棕褐色/复古图像的方法是使用输入图像的红色,绿色和蓝色通道组合创建输出红色,绿色和蓝色组件。
如何以这种方式创建棕褐色/复古图像是使用以下等式。假设输入图像的红色,绿色和蓝色通道分别存储在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
请注意,要再次创建3D矩阵,我使用cat
连接指定维度中的数组/矩阵。我指定了第三个维度,因为我们希望将红色,绿色和蓝色通道堆叠在一起以形成3D矩阵。然后我将此结果转换为uint8
。
这是一个例子。我决定从Jon Woodbury Photography拍摄全家福。那些出现在这里的人我个人并不认识,但感谢让我使用你的照片:)
当我下载此图像时,请使用此图像运行代码,这是我得到的输出:
输入上面的代码非常多。如果您希望使用permute
和reshape
的组合,则可以分为两行(如果您考虑将图像作为一个步骤读取,则为三行)。您需要将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]));
您应该在输出中获得与之前版本的代码相同的内容!作为测试,您在下面的评论中提供了一个图像:
这是我使用修改后的代码所获得的(实际上,您只需获得与代码的第一个版本相同的结果):