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 commentaires

Attach sample image, so that we can try on it? Skin color?
One of the figure from internet is

Connectez-vous pour commenter.

 Réponse acceptée

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 commentaires

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.

Connectez-vous pour commenter.

Plus de réponses (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 commentaires

Thank you @darova for the reply, It is somehow a little different.
Isn't that you wanted?
export_fig_out.png
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?
No, I didn't.
Good. Don't do this

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by