如何更改图像的整体色调,类似于Photoshop的色调调整?

时间:2016-05-09 20:55:12

标签: image matlab image-processing colors psychtoolbox

在Photoshop中,我可以调整图像的整体色调,使黑色/白色/灰色等级保持不受影响,而色调分别变为-100左右(附加比例图)。是否有可以实现此目的的MATLAB或PsychToolbox功能?

例如,某些函数如newImage = hueadjust(Image, -100)或类似这样的东西。

我有很多图像,我确定可以通过Photoshop批量处理所有图像,因此所有图像都应用相同的色调比例,但想知道这是否可以通过代码相对轻松地完成鉴于我缺乏编码经验。

Adobe Photoshop's hue adjustment

1 个答案:

答案 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图像。它看起来像这样:

enter image description here

我们先来看看这张图片。可以使用图片所指的URL直接从Internet读取上述图像:

im = imread('http://i.stack.imgur.com/BULoQ.png');

来自IPT的imread功能的好处是你可以直接从互联网上阅读图像。我想改变或移动色调,使红色色调是洋红色,这意味着将每个色调中的所有色调移动-45度。所以像这样运行函数:

out = hueadjust(im, -45);

使用imshow(out)显示图片,我们得到:

enter image description here

请注意,转换后的其余色调是有道理的。果岭是一种相当沉闷的绿色,可能在60度左右左右徘徊。减去45会将其推到红色色调,您可以在生成的图像中看到它。关于黄色的情况也是如此,因为它们在30-40度的色调上盘旋。另请注意,白色的颜色稍有影响,因为在这些白色区域中看到的颜色不是纯白色(也就是100%饱和度),这是预期的。