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

标签 image matlab image-processing colors psychtoolbox

在Photoshop中,我可以调整图像的整体色调,使黑/白/灰级别不受影响,而色调分别变化到-100左右(附比例图)。是否有 MATLAB 或 PsychToolbox 函数可以完成此任务?

例如,像 newImage = Hueadjust(Image, -100) 这样的函数或类似这样的简单函数。

我有很多图像,我确信有一种方法可以通过 Photoshop 对所有图像进行批处理,以便将相同的色调比例应用于所有图像,但考虑到我缺乏编码,我想知道这是否可以通过代码相对轻松地完成经验。

Adobe Photoshop's hue adjustment

最佳答案

是的,这很简单。只需将图像转换为 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 图像。它看起来像这样:

enter image description here

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

im = imread('/image/BULoQ.png');

IPT 的 imread 函数的好处是您可以直接从 Internet 读取图像。我想变换或移动色调,使红色色调变为洋红色,这意味着将每个色调中的所有色调移动 -45 度。因此,像这样运行该函数:

out = hueadjust(im, -45);

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

enter image description here

请注意,其余色调在变换后才有意义。绿色是相当暗淡的绿色,色调可能徘徊在 60 度左右。减去 45 会将其推至红色色调,您可以在生成的图像中看到这一点。黄色也是如此,因为它们的色相徘徊在 30 - 40 度左右。另请注意,白色最有可能受到一点影响,因为在这些白色区域中看到的颜色不是纯白色(也称为不是 100% 饱和度),这是预期的。

关于image - 如何更改图像的整体色调,类似于 Photoshop 的色调调整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37125292/

相关文章:

Python 到 MATLAB : exporting list of strings using scipy. io

c++ - cuda 多重图像侵 eclipse 不起作用

python - Python Fit圆,其中心位于图像外部

javascript - 在 Apps 脚本中将 base64 编码图像与 HtmlService 结合使用

ios - 图像选择器显示多个图像,如拼贴画,没有内存问题

iphone - iOS:从网址下载图片并保存在设备中

matlab - Matlab中是否可以只排列图形的最大极限?

matlab - 矢量化 Octave /matlab代码

image - HL7 V3 ED 数据类型是在 HL7 消息/文档中发送多媒体数据的唯一可能性吗?

iphone - 拼接图像时收到内存警告