2012-03-13 65 views
2

RGB由三个通道组成 - 红色,绿色,蓝色。如何让我们说rgb中的棕色通道?如何从照片中获取任何颜色的通道?

我需要它能够识别照片中的褐色(生锈)物体,因此将照片转换为“棕色通道”会很好。

编辑:

下面是从中棕色应当承认照片:

http://dl.dropbox.com/u/4571/section.jpg

+0

下面是一个相关的问题,显示检测图像中的颜色的技术:[如何将RGB图像转换为灰度但保留一种颜色?](http://stackoverflow.com/q/4063965/52738) – gnovice 2012-03-14 15:43:59

回答

2

人们可以从字面上的二维中想到棕褐色,但棕色通道只能是一维。 Ergo,你无法像你想的那样容易地定义一个棕色通道。

即使红色通道并没有真正定义颜色的红色,所以您需要在任何人可以帮助您之前定义棕色通道的含义。有很多方法可以伪造图像以反映任何给定像素的棕色。也许你可以从一些标称的棕色颜色中选择L * a * b *单位的欧几里德距离(通常称为ΔE)。当然,如果你是给定颜色的红色,绿色或蓝色(全部是相同的量),这会给你同样的棕色。假设我们直接从中性轴移动k个单位,而不是直接移动到中性轴k个单位。当然,远离中性会产生更多的棕色,但上述定义(以德耳塔E表示)并不是这样。

您可能会考虑将颜色空间中的某些路径定义为棕色。因此,考虑从白色到您将定义为“棕色”的点的路径。 (仔细挑选这一点,它是否在色域边界上?如果不是,当你朝那个方向进一步移动时会发生什么?)现在,棕褐色基本上是沿着你的路径从白色到白色的距离。对于不在该路径上的任何颜色,将该点正交投影到路径上以确定其基本的棕色。请注意,如果您的路径定义在您的色彩空间中是直线,则会有所帮助,否则此正交投影会变得有点令人讨厌。

给定一段时间,我可能会想出另一种方法来定义棕色,但这是你的问题,而不是我的。只有你可以定义你的意思。

编辑:鉴于修改后的问题中显示的图片,我会建议一个简单的方案。这些“褐色”斑点似乎由深褐色组成,并且是淡淡的,几乎淡黄色的“棕褐色”,但在这两种替代品之间并不真正。所以,将你的图像转换成像CIE Lab这样的色彩空间。现在,每个像素将以实验室空间中的相应坐标表示,而不是RGB。现在,选择名义上的棕色和名义上的黄色,然后从这两点计算实验室中的欧几里德距离。如果像素在某个指定的容差范围内,则将其称为棕色或黄色。这是您的问题的常见解决方案。

+0

感谢您的解释。我会尽力去走这条路。我已经更新了我的问题,并附有我想要承认的棕色斑点图片的链接。 – 2012-03-13 15:01:12

0

我会去通过照片搜索我的棕褐色

我锈褐色将是“165; 42; 42”的RGB。

调色板
http://web.njit.edu/~kevin/rgb.txt.html#Brown

我将遍历每个像素,并检查是否有任何类似的值。如果其中一个通道足够接近基准(比如+/- 5),我会将这个pixcel的坐标保存在单独的列表中。

这也使我灵敏度的控制 - 我能决定的解决方案应该如何准确的是...

而且随着保存pixcels的列表,你可以简单地重新着色,即它们作为黄,以显示您的应用程序向用户发现了什么。

这个解决方案可能会很慢,但是...如果有任何内建的解决方案我不知道,使用它们可能会更明智。

+0

感谢您的建议。如果没有其他事情发生,我会使用这种方法。但我更喜欢更“先进”的东西。 – 2012-03-13 11:16:15

1

您可以尝试使用欧几里德距离来测量像素颜色和目标颜色之间的距离。然后,您可能会在此之上添加阈值技术,以仅选择在目标颜色的定义范围内的像素。

在RGB空间中的欧几里德距离很简单:距离= SQRT((RT-RP)^ 2 +(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]); 

只测试,它可以工作,也许这将是不准确的满足你的需求。