【发布时间】:2018-03-12 15:50:44
【问题描述】:
- 我得到了一张这样的图片,我想将一些特殊类型的滤镜应用到:
- 我为深绿色区域(最大的区域)设置了 RGB 颜色 (
49, 76, 14)。
所以我想获得某种阈值属性用于过滤目的:我想过滤每个图像像素以检查它的颜色是否接近给定的 RGB 值 (49, 76, 14)。阈值表示偏移率。
Threshold small :
--> `(49, 76, 14) close to (48, 75, 13)`
--> `(49, 76, 14) "not" close to (50, 75, 13)`
Threshold big :
--> `(49, 76, 14) close to (48, 75, 13)`
--> `(49, 76, 14) "also" close to (50, 75, 13)`
过滤具有最小阈值的图像,只过滤给定的 rgb 颜色:
更大的阈值也会过滤给定 rgb 颜色附近的颜色:
如何实现编码一个能够检查一种颜色是否接近另一种颜色(+阈值属性)(+使用 rgb 值)的函数?
注意:
这是我在上面首先考虑的代码,但对其进行了测试 - 它并没有真正导致成功(通过过滤给定的值,左上角的小区域首先应该被过滤,因为它的颜色几乎看起来像给定的一。但是这段代码首先匹配的是灰色的,显然与给定的颜色不匹配!)
var offset = (threshold/100.0) * 255.0
var color = [r,g,b]
var r = redvalue, g = greenvalue, b = bluevalue
if !(
(r >= color[0]-offset) &&
(r <= color[0]+offset) &&
(g >= color[1]-offset) &&
(g <= color[1]+offset) &&
(b >= color[2]-offset) &&
(b <= color[2]+offset)
) { // apply filter }
任何帮助将不胜感激。一些用 Swift 或 JavaScript 甚至一些 PseudoCode 编写的源代码也可以。
编辑: 一个自发的想法是将 rgb-colors int lab-colors 转换为随后计算 欧几里得距离 来自两种颜色。但我不确定这个解决方案是否有效,也不确定它是否是最有效的解决方案:)
【问题讨论】:
-
有一些有趣的想法here
-
我编写了一个应用程序,通过将颜色的“距离”与命名颜色的规范 RGB 十六进制进行比较来命名图像中的颜色(ISTR 我使用了 X11 列表) - 我最终不得不这样做它在 HSL(色相饱和度亮度)而不是 RGB 中,色相的权重为 10 - 任意,但这似乎工作得很好。
-
能分享一些sn-ps的代码吗?
:)@Grimxn -
我认为您将浮点值与整数混合,这会导致舍入错误,因为您在示例中显示的两种颜色与您比较的绿色具有相同的距离......
48和 @987654336 @ 与49的距离相同...尝试使用offset = round((threshold/100.0) * 255.0);或floor或ceil....我通常使用距离。您可以将颜色处理为 3D 向量,因此减去它们并计算距离...不需要 sqrt 您可以将距离^2 与阈值^2 进行比较...请参阅Detectings small circles on game minimap 我正是这样做的。 -
如果您需要更好的颜色检测,您可以使用 HSV,它处理颜色的方式更像人类感知。
标签: javascript ios swift algorithm colors