检查每个像素的特定颜色(在特定阈值内)

时间:2009-03-16 13:44:31

标签: matlab image-processing colors rgb

我在MATLAB中有一个RGB图像,我想循环遍历每个像素并检查它是否是肤色(ish)[我可能会在以后的HSV空间中进行,以消除光照等的影响]

有谁知道最好的方法吗? MATLAB奇怪的语法让我有点困惑!

目前我有:

for x = 1:size(I,1)
    for y = 1:size(I,2)
            %Get the value from this x,y coordinate and check the colour.
    end
end

但我认为这是非常错误的。

如何正确访问矩阵的不同部分?

3 个答案:

答案 0 :(得分:7)

版,

您无需循环:

>> a  = magic(5)

a =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9


>> vi = (a > 5) & (a < 10)

vi =

     0     0     0     1     0
     0     0     1     0     0
     0     1     0     0     0
     0     0     0     0     0
     0     0     0     0     1

您可以看到如何为RGB等扩展此语句。我会做一个功能


function out = isFlesh(in)

%%在此处输入肉体检查代码


我怀疑你会想要一系列的这些(isCaucasian,isAsian等等)问题是,有大量的肉色,所以你要检查接近程度到相似颜色范围的邻居。

这部分问题很容易,但更大的问题充满了危险。

-Doug

答案 1 :(得分:4)

要记住的一件事是RGB图像是三维矩阵。第一个“页面”(即 A(:,:,1))为红色,第二个为绿色,第三个为蓝色。有时我发现通过将它们重新整形为N-by-3矩阵更容易操作RGB矩阵,其中所有红色像素都在第1列,第2列为绿色,第3列为蓝色。这是如何做到的:

A = (a 3-D RGB image);
matSize = size(A);
A = reshape(A,prod(matSize(1:2)),3);
...
% Modify or extract data from reshaped matrix
...
A = reshape(A,matSize);  % Return A to original dimensions

不确定这是否能帮助您专门处理您想要做的事情,但我经常觉得它很有用。

答案 2 :(得分:3)

对每个通道进行阈值处理并不是一种非常健壮的肤色检测方法。一个简单的查找表工作得更好。查找表将为每种颜色记录一个皮肤的可能性。您可以使用各种肤色数据集来获取此类值。然后,您可以将像素的颜色与表中的值进行比较,并根据阈值做出决策。