2

我在 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

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

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

4

3 回答 3

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 等扩展此语句。我会做一个功能


函数输出 = isFlesh(in)

%% 在这里放肉检查代码


我怀疑你会想要一系列这些(isCaucasian、isAsian 等......)问题是肉色的范围很广,所以你要检查与邻居的接近度相似的颜色范围。

这部分问题很简单,但更大的问题却充满了危险。

-道格

于 2009-03-16T13:53:25.530 回答
4

要记住的一件事是 RGB 图像是 3-D 矩阵。第一个“页面”(即A(:,:,1))是红色的,第二个是绿色的,第三个是蓝色的。有时我发现通过将 RGB 矩阵重新整形为 N×3 矩阵更容易操作,其中所有红色像素在第 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

不确定这是否会具体帮助您完成您想做的事情,但我经常发现它很有用。

于 2009-03-16T14:07:21.097 回答
3

对每个通道进行阈值化并不是一种非常可靠的肤色检测方法。一个简单的查找表效果更好。查找表将为每种颜色记录一个值,它是皮肤的可能性有多大。您可以使用各种肤色数据集来获取这些值。然后您可以将像素的颜色与表中的值进行比较,并根据阈值进行决策。

于 2009-03-17T20:50:01.487 回答