在Photoshop中,我可以调整图像的整体色调,使黑色/白色/灰色等级保持不受影响,而色调分别变为-100左右(附加比例图)。是否有可以实现此目的的MATLAB或PsychToolbox功能?
例如,某些函数如newImage = hueadjust(Image, -100)
或类似这样的东西。
我有很多图像,我确定可以通过Photoshop批量处理所有图像,因此所有图像都应用相同的色调比例,但想知道这是否可以通过代码相对轻松地完成鉴于我缺乏编码经验。
答案 0 :(得分:3)
是的,这很简单。只需将图像转换为HSV,采用色调通道并以360度模数加或减,然后将图像转换回来。请注意,操纵色调不会影响图像中看到的黑/灰/白色,这实际上是您所希望的。 HSV颜色空间中的饱和度和值组件为我们做到了这一点。每个像素的色调组件的添加和/或减法是Photoshop(以及其他类似的图形编辑器,如GIMP)在幕后执行的。
使用函数rgb2hsv
及其等效对象hsv2rgb
。但是,每个转换通道的动态范围来自[0,1]
,但通常色调表示在0到360度之间。因此,将色调通道乘以360,进行模数运算,然后在完成时除以360.
如果你想在帖子中创建一个名为hueadjust
的函数,只需执行以下操作:
function newImage = hueadjust(img, hAdjust)
hsv = rgb2hsv(img);
hue = 360*hsv(:,:,1);
hsv(:,:,1) = (mod(hue + hAdjust, 360)) / 360;
newImage = hsv2rgb(hsv);
end
第一行代码将图像转换为HSV。下一行代码将色调通道复制到一个名为hue
的变量中,并将每个值乘以360.然后,我们通过获取原始图像的每个色调值(存储在原始图像中)将其写回原始图像的色调通道。 hue
)按hAdjust
添加每个色调,这是所需的度数偏移,并确保如果我们超过360度(这是mod
正在做的事情)我们回绕到0,然后划分360的结果是回到预期的[0,1]
动态范围。此修改后的图像现在转换回RGB并发送到输出。
请注意,由于调用double
,输出图片将为hsv2rgb
类型。每个通道的动态范围仍然在[0,1]
范围内,因此您可以轻松地将这些图像写入文件而不会出现问题。如果由于某种原因想要返回到图像本身的原始类型,可以使用图像处理工具箱中的im2uint8
等函数将输入转换回无符号的8位整数形式。在实践中看到的大多数图像都采用这个标准。
这是一个快速示例,了解此功能的工作原理。另外,让我们来看看色调圆圈的完整性:
http://lodev.org/cgtutor/images/hslhuecircle.jpg
来源:Lode's Computer Graphics Tutorial
我们可以看到红色的色调约为0度,而洋红色的色调约为315度或-45度。我们还使用MATLAB中伴随图像处理工具箱的onions.png
图像。它看起来像这样:
我们先来看看这张图片。可以使用图片所指的URL直接从Internet读取上述图像:
im = imread('http://i.stack.imgur.com/BULoQ.png');
来自IPT的imread
功能的好处是你可以直接从互联网上阅读图像。我想改变或移动色调,使红色色调是洋红色,这意味着将每个色调中的所有色调移动-45度。所以像这样运行函数:
out = hueadjust(im, -45);
使用imshow(out)
显示图片,我们得到:
请注意,转换后的其余色调是有道理的。果岭是一种相当沉闷的绿色,可能在60度左右左右徘徊。减去45会将其推到红色色调,您可以在生成的图像中看到它。关于黄色的情况也是如此,因为它们在30-40度的色调上盘旋。另请注意,白色的颜色稍有影响,因为在这些白色区域中看到的颜色不是纯白色(也就是100%饱和度),这是预期的。