如何从照片中获取任何颜色的频道
本文关键字:任何 颜色 频道 获取 照片 | 更新日期: 2023-09-27 18:27:30
RGB由三个通道组成——红色、绿色、蓝色。我该如何从rgb中取出棕色通道?
我需要它能够识别照片中的棕色(生锈)物体,所以将照片转换为"棕色通道"会很好。
编辑:
这是应该识别棕色的照片:
http://dl.dropbox.com/u/4571/section.jpg
人们可以在二维中想象棕色,但棕色通道只能是一维。呃,你不能像你希望的那样容易地定义一个棕色通道。
即使是红色通道也不能真正定义一种颜色的红色,所以在有人帮助你之前,你需要定义你所说的棕色通道是什么意思。有很多方法可以使图像假彩色以反映任何给定像素的棕色。也许你可以从一些标称的棕色中选择以L*a*b*为单位的欧几里得距离(通常称为delta E)。当然,如果你是红色、绿色或蓝色(数量相同),这会给你同样的棕色。假设我们从中性轴直接移出k个单位,而不是直接移入中性轴k个单位。当然,远离中性会产生一种更棕色的颜色,但以上的定义(根据ΔE)会说这不是真的。
你可能会把一些穿过颜色空间的路径看作是定义棕色。因此,考虑从白色到您将定义为"棕色"的点的路径。(仔细选择这一点。它在色域边界上吗?如果不是,当你朝着这个方向走得更远时会发生什么?)现在,棕色本质上是沿着你的路径与白色的距离。对于不在该路径上的任何颜色,将点垂直向下投影到路径上,以确定其基本的棕色。请注意,如果路径的定义是颜色空间中的一条直线,这将有所帮助,否则这种正交投影会变得有点糟糕。
如果有一段时间,我可能会想出另一种定义棕色的方法,但这是你的问题,而不是我的问题。只有你才能定义你的意思。
编辑:考虑到修改后的问题中显示的图片,我建议一个简单的方案。"棕色"斑点似乎由深棕色和浅黄色的"棕褐色"组成,但这两种颜色之间并没有太大的区别。因此,将您的图像转换到像CIE实验室这样的颜色空间中。现在,每个像素都将用实验室空间中的相应坐标表示,而不是RGB。现在,选择标称的棕色和标称的黄色,并在实验室中计算这两个点的欧几里得距离。如果像素在某个指定的公差范围内,则称其为棕色或黄色。这是解决您问题的常用方法。
您可以尝试使用欧氏距离来测量像素颜色和目标颜色之间的距离。然后,您可能会在此基础上添加阈值技术,只选择目标颜色定义范围内的像素。
RGB空间中的欧氏距离简单地为:距离=sqrt((Rt-Rp)^2+(Rt-Rp)^2+
其中Xt和Xp是目标颜色和图像像素的RGB分量。
你可以通过最大可能的距离来归一化它,也就是黑色和白色之间的距离(我不确定最后一部分,你可以尝试交替归一化)。
以下是Matlab中的一个示例:
% Load image in RGB encoding
file='rust.jpg';
img=imread(file);
% Target
brown=[165 42 42];
imgd=double(img);
% Compute the euclidean distance so that 255 is exactly this color and 0 the maximum possible distance (between black and white)
browndistance=uint8(255-255*sqrt((brown(1)-imgd(:,:,1)).^2+(brown(2)-imgd(:,:,2)).^2+(brown(3)-imgd(:,:,3)).^2)/sqrt(255^2+255^2+255^2));
figure;
imshow(browndistance,[0 255]);
只测试它是否有效,也许它不够准确,无法满足您的需求。
您可以尝试AForge.NET,我认为AForge.Imaging.Filters.ExtractChannel正是您想要的。如果没有,还有一些其他与RGB通道相关的方法。
我会浏览照片,寻找我的棕色
我的锈褐色在RGB中应该是"165;42;42"。
调色板
http://web.njit.edu/~kevin/rgb.txt.html#Brown
我会遍历每个像素,并检查是否有类似的值。如果其中一个通道离基准足够近(比如+/-5),我会将这样的像素的坐标保存在单独的列表中。
这也将使我能够控制灵敏度——我将能够决定解决方案的准确性…
有了一个保存的像素列表,你可以简单地将它们重新着色,即黄色,向用户显示你的应用程序找到了什么。
不过,这个解决方案可能很慢。。。如果有我不知道的内置解决方案,使用它们可能会更明智。