选择性灰度滤镜






4.63/5 (15投票s)
2007年7月3日
3分钟阅读

54549

2502
将图像转换为灰度,
引言
这个 Visual Basic .NET 类实现了一个图像滤镜,可以将 RGB 图像转换为灰度图像,同时保留选定的 RGB 值范围不变。提供了一个小型演示项目来展示该滤镜的用法。
背景
在创建和优化 色调/饱和度/亮度滤镜 和 灰度滤镜 的过程中,我学到了很多关于图像和颜色的知识。观察 HSL 色环(如下所示),我萌生了一个想法,制作一个滤镜,让某种颜色保持不变,而其他颜色则转换为灰度。
从 HSL 色环中可以看出,相似的颜色都聚集在一定的角度范围内。如果我们希望红色保持不变,而其他颜色转换为灰度,那么我们不应该改变色调在 0 度左右的像素。由于我已经编写了 HSL 和灰度的转换程序,因此编程实现这个滤镜很容易。大部分时间都用于实现容差计算。在测试滤镜时,我发现实现饱和度和亮度容差的决定是正确的。可以有效地过滤阴影,降低饱和度和亮度容差。
饱和度和亮度 (SL) 的容差以一种略微不寻常的方式工作。我将希望保持不变的颜色的 SL 作为零容差。正负容差不一定具有相等的值。例如,如果我们希望保持不变的颜色的饱和度为 0.75,那么将容差设置为 0.1(10%),则负容差将为 0.075,正容差将为 0.025,即 0.75 和 1.0 之间的差的 10%。
使用代码
使用滤镜很简单。设置属性并调用执行函数。我提供了一个小型演示项目,您可以在其中使用两个滤镜,更改颜色因子和颜色,最后保存过滤后的图像。项目中包含的代码也包含在内。
演示应用程序的基础与其他两个提到的项目相同。通过滑块,您可以更改色调(0 到 180 度)、饱和度和亮度(0 到 100%)的容差。您可以使用颜色对话框和颜色选择器选择颜色。颜色选择器的实现有点笨拙。您必须单击“Picker”按钮,选择颜色,然后再次单击同一按钮以获取正常的光标。只有在显示“Picker”光标时,拾取颜色才有效。光标下的颜色显示在按钮之间的一个小方块中。
演示应用程序使用了一个廉价的技巧来使其看起来很快。显示的图片已调整大小,并且所有过滤都在调整大小的图像上完成。仅在保存之前才对真实图像进行过滤,因此保存可能需要更多时间:在我的计算机上,图像大小为 2288x1712 像素,大约需要 2 秒钟。我提供了两张图片供您开始使用。我在两张图片上都获得了不错的效果。
关注点
在准备演示应用程序时,我学会了如何使用自定义图像更改光标。如果您已经拥有光标文件,这很简单。如果您要制作一个光标文件,则需要做更多的工作。
我需要一篇关于 HSL 色环图像的文章,只是为了好玩,我编程了一个函数,该函数可以使用给定的圆半径和亮度值创建所需的图像。
历史
- 2007-06-25:版本 1.0
- 2007-07-12:文章经过编辑并移至 CodeProject.com 的主要文章库