我从未使用你所说的不透明度在图像上创建类似棕褐色/复古的效果。通常我用输入图像的红、绿和蓝通道的组合来创建棕褐色/复古图像的输出红、绿和蓝分量。使用以下方程式即可创建这种棕褐色/复古效果。假设您的输入图像的红、绿和蓝通道分别存储在
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)
来源: Tech Republic
outputRed
、
outputGreen
和
outputBlue
是深褐色/复古图像的输出颜色通道。因此,只需读入图像,然后提取每个颜色平面,对于每个输出颜色通道进行加权组合,然后将通道合并在一起即可。需要注意的是,当您读入图像时,这很可能是
uint8
类型。为了在乘以小数时保持精度,您需要在继续之前将图像转换为
double
。一旦计算出深褐色/复古色调通道,您需要将结果转换回
uint8
,以便正确显示图像并将其保存到磁盘。因此,以下是代码:
im = double(imread('...'));
inputRed = im(:,:,1);
inputGreen = im(:,:,2);
inputBlue = im(:,:,3);
outputRed = (inputRed * .393) + (inputGreen *.769) + (inputBlue * .189);
outputGreen = (inputRed * .349) + (inputGreen *.686) + (inputBlue * .168);
outputBlue = (inputRed * .272) + (inputGreen *.534) + (inputBlue * .131);
out = uint8(cat(3, outputRed, outputGreen, outputBlue));
figure;
imshow(im,[]);
figure;
imshow(out);
请注意,要重新创建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](https://istack.dev59.com/jEruu.webp)
旁注 - 效率
上述代码需要输入相当多的内容。如果您愿意,可以使用 permute
和 reshape
的组合来将其缩减为两行(如果考虑读取图像作为一步,则为三行)。 您需要将棕褐色系数封装在一个二维矩阵中,然后可以通过矩阵乘法计算每个输出像素。 因此:
im = double(imread('...'));
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]));
您应该得到与代码先前版本相同的输出!作为测试,您在下面的评论中提供了一张图片:
![](https://i.ytimg.com/vi/14khxLI8j4U/maxresdefault.jpg)
这是我使用修改后的代码得到的结果(实际上,您将只会得到与代码第一个版本相同的结果):
![enter image description here](https://istack.dev59.com/djdyW.webp)