在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
基于区域的全局阈值选取方法对一幅图像而言,不同的区域,比如说目标区域或背景区域,同一区域内的象素,在位置和灰度级上同时具有较强的一致性和相关性。而在上述基于点的全局阈值选取方法中,有一个共同的弊病,那就是它们实际上只考虑了直方图提供的灰度级信息,而忽略了图像的空间位置细节,其结果就是它们对于最佳阈值并不是反映在直方图的谷点的情况会束手无策,不幸我们通常遇到的很多图像恰恰是这种情况。另一方面,完全不同的两幅图片却可以有相同的直方图,所以即使对于峰谷明显的情况,这些方法也不能保证你得到合理的阈值。于是,人们又提出了很多基于空间信息的阈值化方法。可以说,局部区域的全局阈值选取方法,是基于点的方法,再加上考虑点领域内象素相关性质组合而成,所以某些方法常称为“二维xxx方法”。由于考虑了象素领域的相关性质,因此对噪声有一定抑止作用。 3 图像切割的实现 3.1 图像切割实现代码 clc clear all; %%%%%%%%%%%%极小值图像切割%%%%%%%%%%%%%%%%%%%%%%%%% I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp'); figure(1); subplot(121),imhist(I); % 观察灰度直方图, 灰度80处有谷,确定阈值T=80 title('直方图'); subplot(1,2,2),imshow(I); title('原图') I1=im2bw(I,80/255); % im2bw函数需要将灰度值转换到[0,1]范围内 figure(2) subplot(3,2,1),imshow(I1); title('极小值点阈值切割'); %%%%%%%%%%%%%%%%%迭代法图像切割%%%%%%%%%%%%%%%%%%%%%%%% I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp'); [x,y]=size(I); a=imhist(I); I=double(I); max=1; for i=2:x if a(max)<a(i) max=i; end end min=1; for i=2:x if a(min)>a(i) min=i; end end z0=max z1=min T=(z0+z1)/2; TT=0; S0=0; n0=0; S1=0; n1=0; allow=0.5; d=abs(T-TT); count=0; while(d>=allow) count=count+1; for i=1:x for j=1:y if (I(i,j)>=T) S0=S0+I(i,j); n0=n0+1; end if (I(i,j)<T) S1=S1+I(i,j); n1=n1+1; end end end T0=S0/n0; T1=S1/n1; TT=(T0+T1)/2; d=abs(T-TT); T=TT; end tmax2=T %tmax2 =77.2717 Seg=zeros(x,y); for i=1:x for j=1:y if(I(i,j)>=T) Seg(i,j)=1; end end end subplot(322),imshow(Seg); title('迭代阈值分割1'); SI=1-Seg; subplot(323),imshow(SI); title('迭代阈值分割2'); %%%%%%%%%%%%%%%%%%最优法切割%%%%%%%%%%%%%%%%%%%%%%%%%% I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp'); [m,n]=size(I); dt = 1; d = 0.3; I9 = I; I9=double(I9); while (abs(dt-d)>0.001) background = 0; object = 0; bm = 0;%背景象素数 om = 0;%前景象素数 for i=1:m for j=1:n if (I9(i,j)<d) background = background +I9(i,j); bm = bm+1; else object = object + I9(i,j); om = om+1; end end end dt = d; d = (background/bm+object/om)/2; %假设先验概率相同 end tmax3=d %tmax3 =79.9102 for i = 1:m for j = 1:n if I9(i,j)<d I9(i,j)=0; else I9(i,j)=1; end end end subplot(324),imshow(I9); title('最优阈值法切割'); %%%%%%%%%%%%%%%%%%%%最大方差法图像切割%%%%%%%%%%%%%%%%%%%%%%%%%%% I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp'); [r,t]=size(I); count=imhist(I); n=r*t; l=256; count=count/n;%各级灰度出现的概率 for i=2:l if count(i)~=0 st=i-1; break end end %以上循环语句实现寻找出现概率不为0的最小灰度值 for i=l:-1:1 if count(i)~=0; nd=i-1; break end end %实现找出出现概率不为0的最大灰度值 f=count(st+1:nd+1); p=st;q=nd-st;%p和q分别是灰度的起始和结束值 u=0; for i=1:q; u=u+f(i)*(p+i-1); ua(i)=u; end %计算图像的平均灰度值 for i=1:q; w(i)=sum(f(1:i)); end %计算出选择不同k的时候,A区域的概率 d=(u*w-ua).^2./(w.*(1-w));%求出不同k值时类间方差 [y,tp]=max(d);%求出最大方差对应的灰度级 tmax4=tp % tmax=96 y1=zeros(r,t); for i=1:r for j=1:t x1(i,j)=double(I(i,j)); end end for i=1:r for j=1:t if (x1(i,j)>tp) y1(i,j)=x1(i,j); else y1(i,j)=0; end end end %上面一段代码实现分割 subplot(325),imshow(y1); title('最大方差法分割的图像'); %%%%%%%%%%%%%%%%%%%最大熵法图像切割%%%%%%%%%%%%%%%%%%%%%%%% I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp'); X=double(I); [M,N]=size(I); hist=zeros(1,256); tic; for i=1:1:M for j=1:1:N fi=X(i,j); hist(fi+1)=hist(fi+1)+1; end end i=1:1:256; p=zeros(1,256); for i=1:1:256 p(i)=hist(i)/(M*N); end E1=zeros(1,256); E2=zeros(1,256); P=zeros(1,256); E=zeros(1,256);
for t=1:1:256 for i=1:1:t P(t)=P(t)+p(i); end if(P(t)>0&&P(t)<1) for i=1:1:t E1(t)=E1(t)-(p(i)/P(t))*log(p(i)/P(t)+eps); end for i=t+1:1:256 E2(t)=E2(t)-(p(i)/(1-P(t)))*log(p(i)/(1-P(t))+eps); end end E(t)=E1(t)+E2(t); end MAX=0.000001; for t=68:1:156 if(E(t)>MAX) MAX=E(t); th=t; end end tmax5=th %tmax5=84 g=zeros(M,N); for i=1:1:M for j=1:1:N if(th<X(i,j)) X(i,j)=1; g(i,j)=X(i,j); else X(i,j)=0; g(i,j)=X(i,j); end end end X=X.*255; X=uint8(X); subplot(326),imshow(X); title('最大熵阈值分割图'); t_eclapsed=toc; |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论