在Photoshop中,我可以调整图像的整体色调,使黑/白/灰级别不受影响,而色调分别变化到-100左右(附比例图)。是否有 MATLAB 或 PsychToolbox 函数可以完成此任务?
例如,像 newImage = Hueadjust(Image, -100)
这样的函数或类似这样的简单函数。
我有很多图像,我确信有一种方法可以通过 Photoshop 对所有图像进行批处理,以便将相同的色调比例应用于所有图像,但考虑到我缺乏编码,我想知道这是否可以通过代码相对轻松地完成经验。
最佳答案
是的,这很简单。只需将图像转换为 HSV,获取色调 channel 并加或减 360 度模,然后将图像转换回来。请注意,操纵色调不会影响图像中看到的黑/灰/白色,这实际上是您想要的。 HSV 色彩空间中的饱和度和明度分量可以为我们做到这一点。每个像素的色调分量的加法和/或减法就是 Photoshop(以及其他类似的图形编辑器,如 GIMP)在后台执行的操作。
使用函数rgb2hsv
及其等效项 hsv2rgb
。然而,每个转换 channel 的动态范围是从[0,1]
开始,但通常色调表示在0到360度之间。因此,将色调 channel 乘以 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。下一行代码将色调 channel 复制到名为 hue
的变量中,并将每个值乘以 360。然后,我们通过获取原始图像的每个色调值写回原始图像的色调 channel (存储在 hue
中)通过 hAdjust
添加每种色调,这是所需的度数偏移,并确保如果超过 360 度,我们会回绕到 0(这就是 >mod
正在执行),然后将结果除以 360 以返回到预期的 [0,1]
动态范围。此修改后的图像现在被转换回 RGB 并发送到输出。
请注意,由于调用了 hsv2rgb
,输出图像将为 double
类型。每个 channel 的动态范围仍在 [0,1]
范围内,因此您可以轻松地将这些图像写入文件而不会出现问题。如果您出于某种原因想要返回到图像本身的原始类型,您可以使用诸如 im2uint8
之类的函数从图像处理工具箱将输入转换回其无符号 8 位整数形式。实践中看到的大多数图像都采用这个标准。
这是一个简单的示例,了解此函数的工作原理。另外,为了完整性,让我们看一下色相环的样子:
来源:Lode's Computer Graphics Tutorial
我们可以看到红色的色调约为 0 度,而洋红色的色调约为 315 度或 -45 度。我们还可以使用 MATLAB 中图像处理工具箱附带的 onions.png
图像。它看起来像这样:
我们也先看看这张图片。可以使用图像引用的 URL 直接从 Internet 读取上图:
im = imread('/image/BULoQ.png');
IPT 的 imread
函数的好处是您可以直接从 Internet 读取图像。我想变换或移动色调,使红色色调变为洋红色,这意味着将每个色调中的所有色调移动 -45 度。因此,像这样运行该函数:
out = hueadjust(im, -45);
使用imshow(out)
显示图像,我们得到:
请注意,其余色调在变换后才有意义。绿色是相当暗淡的绿色,色调可能徘徊在 60 度左右。减去 45 会将其推至红色色调,您可以在生成的图像中看到这一点。黄色也是如此,因为它们的色相徘徊在 30 - 40 度左右。另请注意,白色最有可能受到一点影响,因为在这些白色区域中看到的颜色不是纯白色(也称为不是 100% 饱和度),这是预期的。
关于image - 如何更改图像的整体色调,类似于 Photoshop 的色调调整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37125292/