修改图像的亮度值。阈值

Posted

技术标签:

【中文标题】修改图像的亮度值。阈值【英文标题】:Modifying luminance values of image wrt. a threshold 【发布时间】:2015-03-19 15:26:12 【问题描述】:

我想修改彩色图像像素的亮度值。修改规则如下: Assumption: Luminance values are normalised in [0, 1], 1 = White

    如果所选像素的亮度值高于阈值(例如 thresh=0.5,像素亮度值 = 0.8),则会将其更改为较低的值(例如 0.3),这样当图像被二值化时,该像素将显示为黑色像素。 同样,如果所选像素的亮度值低于阈值,则会增加亮度,使其二值化为白色。

我已尝试使用 MATLAB 的 rgb2hsv()hsv2rgb() 函数将 RGB 图像转换为 HSV,提取亮度通道,对其进行修改,然后将图像改回 RGB。但结果不是我需要的。

我需要的是:

    如果鲜红色像素的亮度降低,它应该变成深红色,因此它会二值化为黑色。 如果白色像素的亮度降低,它应该变成黑色。 如果黑色像素的亮度增加,它应该变成白色。

我有以下问题/疑问:

    当我降低白色像素的亮度时,它会变成红色而不是黑色。 是否可以在不修改 HSV 图像的任何其他通道(例如色相/色度)的情况下实现上述目标? RGB 和 HSV 之间的转换是否无损? 实现这一目标的理想方法是什么?

【问题讨论】:

【参考方案1】:

嗯,

您的第一个语句是相反的,因此如果同时应用它们将反转图像。我猜你只是指出了你想要采取的两种不同的行动。

关于您的问题:

当我降低白色像素的亮度时,它会变成红色 黑色的。

这不可能发生。你在这里犯了一些错误。如果您只是修改亮度,那么颜色不会改变(从白色变为红色)。

不修改是否可以实现上述目标 HSV 图像的任何其他通道,例如色相/色度?

这是唯一正确的方法。请勿修改其他频道。

RGB和HSV之间的转换是否无损?

它已经足够无损了。如果您应用以下命令,结果将处于数值稳定的边缘:

im2 = hsv2rgb(rgb2hsv(im));
im=im2double(im);
sum(im2(:)-im(:))

ans =

   6.9403e-14

实现这一目标的理想方法是什么?

如果您没有任何具体理由不相信,这种方法就足够了。

【讨论】:

不应该是sum(im2(:) - im(:))而不是im4吗?【参考方案2】:

    您只是使用了错误的色彩空间。查看wikipedia article关于HSV和HSL的信息,尤其是右边的比较图。使用 V=1,您可以获得任何“纯”颜色。当您谈论亮度时,您可能应该采用 HSL 的亮度通道。 rgb2hls 在 matlab 文件交换中可用。

    见 1,使用 HSL 然后你必须改变 L 通道

    当您要更改为黑白时,您可以在 HSL 图像中检测要修改的像素,并在 RGB 图像中设置像素。 RGB、HSV 和 HSL 的色彩空间匹配您只有精度误差。使用标准化颜色 (0,1) 和双精度值时,这些错误很小。

【讨论】:

我使用了这个 rgb2hsl 函数来完成工作,但它非常有损 (sum(im2(:) - im(:)) = 0.1598)。我的形象越来越扭曲。有什么资源可以编写更有效的色彩空间转换方法吗? 我无法重现1e-4 以上的错误。你能提供一个示例图片吗? 由于某种原因,hsl2rgbrgb2hsl 两个函数都会对倒数第二行中的值进行舍入。删除这两行,然后我在1e-15下方得到一个绝对错误@ 是的,删除舍入语句将我的错误减少到 1e-12。应该够好了。 是否不能仅在 RGB 颜色空间中执行此操作,而不转换为 HSL? Y = 0.3R + 0.5G + 0.12B 给了我亮度,但是如何修改单个 RGB 分量以改变亮度?与here 中提到的数字> 1< 1 相乘并不能达到我想要的效果,因为我的理论模型将亮度处理在[0, 1] 范围内。我应该如何计算乘数?

以上是关于修改图像的亮度值。阈值的主要内容,如果未能解决你的问题,请参考以下文章

自适应阈值化操作:adaptiveThreshold()函数

快速图像阈值处理

图像预处理

第三章:用opencv3处理图像

模糊图像的阈值 - 第 2 部分

如何计算RGB数字图像处理 亮度的亮度值