主程式:
function tu=keyprogram( )
% 讀取影像
rgb=imread('3000.tif');
rgb=im2double(rgb);
r=rgb(:,:,1);
g=rgb(:,:,2);
b=rgb(:,:,3);
% RGB -> HSI
num=0.5*((r-g)+(r-b));
den=sqrt((r-g).^2+(r-b).*(g-b));
theta=acos(num./(den+eps));
H=theta;
H(b>g)=2*pi-H(b>g);
H=H/(2*pi);
num=min(min(r,g),b);
den=r+g+b;
den(den==0)=eps;
S=1-3.*num./den;
H(S==0)=0;
I=(r+g+b)/3;
S=im2uint8(S);
H=im2uint8(H);
I=im2uint8(I);
S=double(S);H=double(H);I=double(I);
[m,n]=size(S);
% 顯示S、H、I波段
figure;imshow(uint8(S));figure;imshow(uint8(H));figure;imshow(uint8(I));
S1=S;
h1=H;i1=I;
for i=1:m
for j=1:n
if (S(i,j)>=100)
S1(i,j)=255;
else S1(i,j)=0;
end
end
end
figure;imshow(uint8(S1));
for i=1:m
for j=1:n
if (S1(i,j)==0)
H(i,j)=0;
end
end
end
H1=meanshift(H);
figure;imshow(uint8(H1));
for i=1:m
for j=1:n
if (S1(i,j)==255)
I(i,j)=0;
end
end
end
I1=meanshift(I);
figure;imshow(uint8(I1));
for i=1:m
for j=1:n
if (S1(i,j)==0)
H1(i,j)=h1(i,j);
end
end
end
for i=1:m
for j=1:n
if (S1(i,j)==255)
I1(i,j)=i1(i,j);
end
end
end
hsi=cat(3,H1,S1,I1);
figure;imshow(uint8(hsi));
end
呼叫函式:
function p=meanshift(im)
[r,c]=size(im);
f=im;
new_f_x=zeros(r,c);new_f_y=new_f_x;
new_f_gray=f;
hs=7;hr=35;
c1=-hs:hs;c1=repmat(c1,2*hs+1,1);
r1=c1';
es=(r1.^2+c1.^2)/hs^2;index= es>1;
es=exp(-es);es(index)=0;
for i=hs+1:r-hs
for j=hs+1:c-hs
k=i;l=j;count=0;flag=1;
while(flag~=0)
count=count+1;
rr1=r1+k;
cc1=c1+l;
er=((f(i,j)-f(k-hs:k+hs,l-hs:l+hs)).^2)/hr^2;index= er>1;
er=exp(-er);er(index)=0;
new_k=sum(sum(rr1.*es.*er))/sum(sum(es.*er));
new_l=sum(sum(cc1.*es.*er))/sum(sum(es.*er));
shift=sqrt((k-new_k)^2+(l-new_l)^2);
k=round(new_k);
l=round(new_l);
if shift<1
flag=0;
end
if (new_k<hs+1 || new_k>r-hs || new_l<hs+1 || new_l>c-hs)
k=i;l=j;
break;
end
end
er=((f(i,j)-f(k-hs:k+hs,l-hs:l+hs)).^2)/hr^2;er=double(er<=1);
tem=er.*f(k-hs:k+hs,l-hs:l+hs);tem=tem(tem>0);tem=median(tem);
new_f_gray(i,j)=tem;
new_f_x(i,j)=k;new_f_y(i,j)=l;
end
end
p=new_f_gray;
問題時分割后的影像顏色和原圖顏色差異特別大,以及hs和hr這兩個引數怎么改變都不對結果產生影響。剛剛開始學習的小白不是很懂請大家賜教~!
uj5u.com熱心網友回復:
代碼功能歸根結底不是別人幫自己看或講解或注釋出來的;而是被自己靜下心來花足夠長的時間和精力親自動手單步或設斷點或對執行到某步獲得的中間結果顯示或寫到日志檔案中一步一步分析出來的。提醒:再牛×的老師也無法代替學生自己領悟和上廁所!
單步除錯和設斷點除錯(VS IDE中編譯連接通過以后,按F10或F11鍵單步執行,按Shift+F11退出當前函式;在某行按F9設斷點后按F5執行停在該斷點處。)是程式員必須掌握的技能之一。
uj5u.com熱心網友回復:
我覺的可能是引數設定的比較小,然后影像都分割成一小塊一小塊的了轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/95398.html
標籤:圖形處理/算法
