修改图像的亮度值。阈值
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
以上的错误。你能提供一个示例图片吗?
由于某种原因,hsl2rgb
和 rgb2hsl
两个函数都会对倒数第二行中的值进行舍入。删除这两行,然后我在1e-15
下方得到一个绝对错误@
是的,删除舍入语句将我的错误减少到 1e-12
。应该够好了。
是否不能仅在 RGB 颜色空间中执行此操作,而不转换为 HSL? Y = 0.3R + 0.5G + 0.12B
给了我亮度,但是如何修改单个 RGB 分量以改变亮度?与here 中提到的数字> 1
和< 1
相乘并不能达到我想要的效果,因为我的理论模型将亮度处理在[0, 1]
范围内。我应该如何计算乘数?以上是关于修改图像的亮度值。阈值的主要内容,如果未能解决你的问题,请参考以下文章