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?
One of the figure from internet is

Sign in to comment.

 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

What if i have different skin color?
Actually I needed to do work with that algorithm. That's why I was looking for the fast processing of that particular algorithm. However, I appreciate your effort in this regard as from your answer I got the clue of using indexing.
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.

More Answers (1)

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

Thank you @darova for the reply, It is somehow a little different.
Yes, this is what I wanted, I have also reduced the computational cost and sharing my code as well.
I have accepted your this answer but I am not getting the same output as yours.
Did you try to change Color you want?

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!