我在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
但我认为这是非常错误的。
如何正确访问矩阵的不同部分?
答案 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)
对每个通道进行阈值处理并不是一种非常健壮的肤色检测方法。一个简单的查找表工作得更好。查找表将为每种颜色记录一个皮肤的可能性。您可以使用各种肤色数据集来获取此类值。然后,您可以将像素的颜色与表中的值进行比较,并根据阈值做出决策。