2017-02-21 242 views
-1
for each pixel, do 
     if R>90 & R>G & R>B 
     classify the pixel as **Healthy** 
     else 
     classify the pixel as non-healthy 

我试图实现一种算法,其读取皮肤损伤图像并提取R,G,和B值后,将其归类病变成健康的皮肤或非健康皮肤基于如果条件如何在MATLAB中写这个if语句的条件语句?

但是,当我尝试实现它时,只有非健康的皮肤阵列在for循环内部得到更新,并且健康的皮肤阵列保持为零。我不知道如何克服这个故障。请帮忙。

hs=zeros(m,n); %initialising healthy skin array 
nhs=0;   %initialising non-healthy skin array 
R=colorSkin(:, :, 1); 
G=colorSkin(:, :, 2); 
B=colorSkin(:, :, 3); 
for i = 1:m 
    for j = 1:n  
     if R>90&R>B&R>G 
      hs(i, j)= colorSkin(i, j); 
     else 
      nhs(i,j)=colorSkin(i,j); 
     end 
    end 
end 
+1

没有必要循环。你可以写出'result = R> 90&R> G & R>B ;'所以在结果图像中,健康的皮肤是'真实的',非健康的皮肤是'假的' – rahnema1

回答

0

作为替代,矢量化的方法:

R=colorSkin(:, :, 1); 
G=colorSkin(:, :, 2); 
B=colorSkin(:, :, 3); 
skin=repmat(R>90 & R>B & R>G,1,1,3); 

hs=colorSkin; 
hs(~skin)=0; 
nhs(skin)=0; 

这段代码也应大大高于循环

1

当你运行循环时,你只是每次都检查同一个矩阵。

这里R,GB都是二维矩阵。

我想你想要检查每个像素的R,G和B值。

所以,当你做了

if R > 90 & R > B & R > G

它是什么做的是检查所有R矩阵的元素是> 90,这可能不是大多数的时间是正确的。

因此正确实施:

if R(i, j) > 90 & R(i, j) > G(i, j) & R(i, j) > B(i, j)

改变此密码,它应该工作的罚款。如果你想进一步澄清,请做评论。

+0

这是行得通的!但是有一个小错误。我正在使用尺寸为447x700x3double的彩色图像。我的R,G,B频道全部是384x512双。 所以当我运行for循环时,出现错误提示: 试图访问R(1,513);索引越界,因为size(R)= [384,512]。 非健康的皮肤阵列得到正确更新,但健康的皮肤阵列不正确。 – Jennifer

+0

@AnastasiaSakshmi以'hs'的相同方式初始化'nhs'或使用其他答案中的代码来解决您的问题 –

+0

明白了!谢谢。但我无法继续前进。我必须使用以下算法将非健康皮肤像素分类为蓝色面纱或非面纱阵列: 对于提取区域中的每个像素执行 如果R> 90且R> B并且R> G则 标记像素健康的皮肤。 else 忽略像素并继续。 end if end for 将Rs设置为标记为 健康皮肤的像素的红色通道值的平均值。 对于图像中的每个像素执行 NB = B/R + G + B R R = R/RS 如果NB≥0.3和-194≤RR <-51然后 分类像素作为面纱 别的 分类像素作为非面纱 结束如果 结束为 – Jennifer