function Hist = hsv36(I)[M,N,~] = size(I);[H,S,V] = rgb2hsv(I);H = H*360;Hist = zeros(1,36);for i = 1:M for j = 1:N h = H(i,j); v = V(i,j); s = S(i,j); if(v>=0 && v<0.2) l = 0+1; Hist(l) = Hist(l)+1; continue; end; if(s>=0 && s<=0.2) if (v>=0.2 && v<=0.8) l = floor((v-0.2)*10)+1+1; Hist(l) = Hist(l)+1; elseif (v>0.8 && v<=1) l = 7+1; Hist(l) = Hist(l)+1; end continue; end if((s>0.2 && s<=1)&&(v>=0.2 && v<=1)) if h<=22 || h>330 HF = 0; elseif h>22 && h<=45 HF = 1; elseif h>45 && h<=70 HF = 2; elseif h>70 && h<=155 HF = 3; elseif h>155 && h<=186 HF = 4; elseif h>186 && h<=278 HF = 5; elseif h>278 && h<=330 HF = 6; end if(s>0.2 && s<=0.65) SF = 0; elseif(s>0.65 && s<=1) SF = 1; end; if(v>=0.2 && v<=0.7) VF = 0; elseif(v>0.7 && v<=1) VF = 1; end; l = 4*HF + 2*SF + VF + 8 + 1; Hist(l) = Hist(l) + 1; end end end %Hist = Hist/(M*N);
Hist = normr(Hist);
this is my fuction to get hsv color histogram, as you see in which have two for loops, which make code looks ugly, and matlab also doesn't recommend for loop. To make it better, i use arrafun instead of for loop, like that:
function Hist = hsv36_new(I)[M,N,~] = size(I);[H,S,V] = rgb2hsv(I);H = H*360;Hist = zeros(1,36);function calHsvHist(i, j) h = H(i,j); v = V(i,j); s = S(i,j); if(v>=0 && v<0.2) l = 0+1; Hist(l) = Hist(l)+1; return; end; if(s>=0 && s<=0.2) if (v>=0.2 && v<=0.8) l = floor((v-0.2)*10)+1+1; Hist(l) = Hist(l)+1; elseif (v>0.8 && v<=1) l = 7+1; Hist(l) = Hist(l)+1; end return; end if((s>0.2 && s<=1)&&(v>=0.2 && v<=1)) if h<=22 || h>330 HF = 0; elseif h>22 && h<=45 HF = 1; elseif h>45 && h<=70 HF = 2; elseif h>70 && h<=155 HF = 3; elseif h>155 && h<=186 HF = 4; elseif h>186 && h<=278 HF = 5; elseif h>278 && h<=330 HF = 6; end if(s>0.2 && s<=0.65) SF = 0; elseif(s>0.65 && s<=1) SF = 1; end; if(v>=0.2 && v<=0.7) VF = 0; elseif(v>0.7 && v<=1) VF = 1; end; l = 4*HF + 2*SF + VF + 8 + 1; Hist(l) = Hist(l) + 1; end endarrayfun(@(id1) arrayfun(@(id2) calHsvHist(id1, id2), 1:N), 1:M);%Hist = Hist/(M*N);Hist = normr(Hist);end
In for loop case it juse take 0.06 second, but arrayfun case almost 2 second.. why this happen, could someone explain that to me? thank you.
Best Answer