MATLAB Answers

0

Is there a way to overcome For loops for fast processing?

I have written a following MATLAB code to detect skin color pixels from the RGB image. The output is as expected but being pixel by pixel algorithm, my program is taking too long, expecially for high quality images. Is there a way to take out the for loops for fast processing? Thank you.
[s1,s2,s3] = size(I);
skin_img1 = zeros(s1,s2,s3);
maxR = max(max(R));
minR = min(min(R));
maxG = max(max(G))
minG = min(min(G));
maxB = max(max(B));
minB = min(min(B));
for i = 1:s1
for j = 1:s2
if R(i,j)>90/255
if ( G(i,j)>40/255 && B(i,j)>20/255 && abs(R(i,j)-G(i,j))>15/255 && R(i,j)> G(i,j) && R(i,j) > B(i,j)...
&& (max([R(i,j),G(i,j),B(i,j)])- min([R(i,j),G(i,j),B(i,j)]) >15/255));
% (maxR - minR)>15/255 && (maxG - minG)>15/255 && (maxB - minB)>15/255 )
skin_img1(i,j,:) = I (i,j,:);
end
% else
% if( R(i,j)> G(i,j) && R(i,j) > B(i,j) && R(i,j) - G(i,j)> 5/255 && (abs(G(i,j)-B(i,j))>5/255))
% Skin_Image(i,j,:) = I (i,j,:);
% end
end
end
end

  2 Comments

Attach sample image, so that we can try on it? Skin color?

Sign in to comment.

2 Answers

Answer by Muhammad Farhan Mughal on 10 Sep 2019
 Accepted Answer

Following MATLAB code significantly reduced the computatonal cost of the questioned code
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);
R = double(R);
G = double(G);
B = double(B);
R = R/255;
G = G/255;
B = B/255;
[s1,s2,s3] = size(I);
skin_img1 = zeros(s1,s2,s3);
index1 = zeros(size(R));
R1 = R(:) ; G1 = R(:); B1 = B(:);
mat_I = [R1,G1,B1]';
index = R >90/255 & G > 40/255 & B>20/255 & abs(R-G)>15/255 & R> G & R > B &...
reshape((max(mat_I)- min(mat_I)) >15/255, [s1,s2]);
index = uint8(index);
skin_img = repmat(index,[1,1,3]).*I;

  5 Comments

Can i use your code for my study research?
Not for commercial purposes
Yes, you can I also wrote that code for research purposes.

Sign in to comment.


Answer by darova
on 9 Sep 2019

See attached script
clc, clear
A = imread('masson.jpg');
subplot(1,2,1)
imshow(A)
RGB = [40 120 40]; % color you want
e = 40; % color shift / deviation
B = pix_in(A,RGB,e);
B = B + 255.*uint8(~B); % choosing white background
subplot(1,2,2)
imshow(B)

  7 Comments

Did you try to change Color you want?
Good. Don't do this

Sign in to comment.