正在学习meanshift图像分割,这里有一个matlab的程序出现点问题来此请教!

sinat_38792761 2017-05-15 01:04:04
主程序:
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这两个参数怎么改变都不对结果产生影响。刚刚开始学习的小白不是很懂请大家赐教~!
...全文
579 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2017-07-09
  • 打赏
  • 举报
回复
我觉的可能是参数设置的比较小,然后图像都分割成一小块一小块的了
赵4老师 2017-05-16
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧