部分图像分割的方法matlab.docx
- 文档编号:3758906
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:9
- 大小:17.63KB
部分图像分割的方法matlab.docx
《部分图像分割的方法matlab.docx》由会员分享,可在线阅读,更多相关《部分图像分割的方法matlab.docx(9页珍藏版)》请在冰豆网上搜索。
部分图像分割的方法matlab
大津法:
functiony1=OTSU(image,th_set)
image=imread('color1.bmp');
gray=rgb2gray(image);%原图像的灰度图
low_high=stretchlim(gray);%增强图像,似乎也不是一定需要
gray=imadjust(gray,low_high,[]);
%subplot(224);imshow(gray);title('afteradjust');
count=imhist(gray);
[r,t]=size(gray);
n=r*t;
l=256;
count=count/n;%各级灰度出现的概率
fori=2:
l
ifcount(i)~=0
st=i-1;
break
end
end
%以上循环语句实现寻找出现概率不为0的最小灰度值
fori=l:
-1:
1
ifcount(i)~=0;
nd=i-1;
break
end
end
%实现找出出现概率不为0的最大灰度值
f=count(st+1:
nd+1);
p=st;q=nd-st;%p和分别是灰度的起始和结束值
u=0;
fori=1:
q;
u=u+f(i)*(p+i-1);
ua(i)=u;
end
%计算图像的平均灰度值
fori=1:
q;
w(i)=sum(f(1:
i));
end
%计算出选择不同k的时候,A区域的概率
d=(u*w-ua).^2./(w.*(1-w));%求出不同k值时类间方差
[y,tp]=max(d);%求出最大方差对应的灰度级
th=tp+p;
ifth th=tp+p; else th=th_set; %根据具体情况适当修正门限 end y1=zeros(r,t); fori=1: r forj=1: t x1(i,j)=double(gray(i,j)); end end fori=1: r forj=1: t if(x1(i,j)>th) y1(i,j)=x1(i,j); else y1(i,j)=0; end end end %上面一段代码实现分割 %figure,imshow(y1); %title('灰度门限分割的图像'); 程序二: clc; clear; cd 'D: \My Documents\MATLAB' time = now; I = imread('qr4.bmp'); figure (1),imshow(I),title('p1_1.bmp'); % show the picture I2 = rgb2gray(I); figure (2),imshow(I2),title('I2.bmp'); %ÖÐÖµÂ˲¨ J = medfilt2(I2); figure(3),imshow(J); imwrite(J,'J.bmp'); [M N] = size(J); J1 = J(1: M/2,1: fix(N/2)); J2 = J(1: M/2,fix(N/2)+1: N); J3 = J(M/2+1: M, 1: fix(N/2)); J4 = J(M/2+1: M, fix(N/2)+1: N); % figure(4), img = J1; T1 = test_gray2bw( img ); % figure(5), img = J2; T2 = test_gray2bw( img ); % figure(6), img = J3; T3 = test_gray2bw( img ); % figure(7), img = J4; T4 = test_gray2bw( img ); T = [T1,T2;T3,T4]; figure,imshow(T) % T1 = edge(T,'sobel'); % figure,imshow(T1); % BW = edge(T,'sobel'); % figure,imshow(BW); function [bw_img] = test_gray2bw( img ) %大津法 [row_img col_img ] = size( img ) all_pix = row_img * col_img % get probability of each pixel(ÏñËØ). count_pix = zeros(1,256) % pro_pix = [] for i = 1 : 1 : row_img for j = 1 : 1 : col_img count_pix(1,img(i,j)+1) = count_pix(1,img(i,j)+1) + 1 %ͳ¼Æ´ÎÊý end end pro_pix = count_pix / all_pix % choose k value; max_kesi = -1 T = 0 for k = 1 : 1 : while( i <= k ) wa = wa + pro_pix(1,i+1) %Ç°k¸öi£¬Ã¿¸öÏñËصĻҶȸÅÂÊ£¬¸ÅÂÊºÍ ua = ua + i * pro_pix(1,i+1) i = i + 1 end if ( wa == 0.0 ) continue; else ua = ua / wa end ub = 0 wb = 0 i = k + 1 while( i <= 255 ) wb = wb + pro_pix( 1 , i + 1 ) ub = ub + i * pro_pix( 1 , i + 1 ) i = i + 1 end if ( wb == 0.0 ) continue; else ub = ub / wb end u = wa * ua + wb * ub % kesi = wa * ( ua - u ) * ( ua - u ) + wb * ( ub - u ) * ( ub -u ) % %ÉÏÏÂÕâÁ½¸ö¹«Ê½ÊÇµÈ¼ÛµÄ kesi = wa * wb * (ua - ub)^2; if( kesi > max_kesi ) max_kesi = kesi T = k end end % get bw img bw_img = img for i = 1 : 1 : row_img for j = 1 : 1 : col_img if ( img(i,j) <= T ) bw_img(i,j) = 0 else bw_img( i,j ) = 255 end end end imwrite(bw_img,'bw_img.bmp') figure(),imshow('bw_img.bmp')%,title('bw_ing') 区域生长法: closeall; clearall; clc; A=dicomread('im.dcm'); %读入图像(医学CT图像) %seed=[200,220]; %选择起始位置 thresh=6.3; %相似性选择阈值 %A=rgb2gray(A0); %A=A0; %灰度化 %A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]); figure, imshow(A,[]); A=double(A);%将图像灰度化 [y,x]=getpts;%获得区域生长起始点 x1=round(x);%横坐标取整 y1=round(y);%纵坐标取整 seed=A(x1,y1); B=A; %将A赋予B [r,c]=size(B); %图像尺寸r为行数,c为列数 n=r*c; %计算图像所包含点的个数 pixel_seed=seed; %原图起始点灰度值 q=[x1y1]; %q用来装载起始位置 top=1; %循环判断flag M=zeros(r,c); %建立一个与原图形同等大小的矩阵 M(x1,y1)=1; %将起始点赋为1,其余为0 count=1; %计数器 whiletop~=0 %也可以写成top! =0循环结束条件 r1=q(1,1); %起始点行位置 c1=q(1,2); %起始点列位置 p=A(r1,c1); %起始点灰度值 dge=0; fori=-1: 1 %周围点的循环判断 forj=-1: 1 ifr1+i<=r&r1+i>0&c1+j<=c&c1+j>0 %保证在点周围范围之内 ifabs(A(r1+i,c1+j)-p)<=thresh&M(r1+i,c1+j)~=1 %判定条件? top=top+1; %满足判定条件top加1,top为多少,则q的行数有多少行 q(top,: )=[r1+ic1+j]; %将满足判定条件的周围点的位置赋予q,q记载了满足判定的每一外点 M(r1+i,c1+j)=1; %满足判定条件将M中相对应的点赋为1 count=count+1; %统计满足判定条件的点个数,其实与top此时的值一样 B(r1+i,c1+j)=1; %满足判定条件将B中相对应的点赋为1 end ifM(r1+i,c1+j)==0; %如果M中相对应点的值为0将dge赋为1,也是说这几个点不满足条件 dge=1; %将dge赋为1 end else dge=1; %点在图像外将dge赋为1 end end end %此时对周围几点判断完毕,在点在图像外或不满足判定条件则将dge赋为1,满足条件dge为0 ifdge~=1 %最后判断的周围点(i=1,j=1)是否满足条件,如dge=0,满足。 dge=1,不满足。 B(r1,c1)=A(x1,y1); %将原图像起始位置灰度值赋予B end ifcount>=n %如果满足判定条件的点个数大于等于n top=1; end q=q(2: top,: ); top=top-1; end %subplot(1,2,1), figure, imshow(M,'displayrange',[]); figure, %subplot(1,2,2), imshow(B,[]); %最后是做的一个例子 迭代法: clearall; I=imread('rice.png'); ZMAX=max(max(I)); %取出最大灰度值 ZMIN=min(min(I)); %取出最小灰度值 TK=(ZMAX+ZMIN)/2; bcal=1; ISIZE=size(I); %读出图像大小 while(bcal) iForeground=0; %定义前景和背景数 iBackground=0; ForegroundSum=0; %定义前景和背景灰度总和 BackgroundSum=0; fori=1: ISIZE (1) %循环部分求解读下% forj=1: ISIZE (2) tmp=I(i,j); if(tmp>=TK) iForeground=iForeground+1; ForegroundSum=ForegroundSum+double(tmp); %前景灰度值 else iBackground=iBackground+1; BackgroundSum=BackgroundSum+double(tmp); end end end ZO=ForegroundSum/iForeground; %计算前景和背景的平均值 ZB=BackgroundSum/iBackground; TKTmp=uint8(ZO+ZB)/2; if(TKTmp==TK) bcal=0; else TK=TKTmp; end %当阈值不再变化的时候,说明迭代结束 end disp(strcat('迭代后的阀值: ',num2str(double(TK)))); %显示迭代计算后阈值TK newI=im2bw(I,double(TK)/255); subplot(1,2,1);imshow(I); xlabel('(a)原始图像'); subplot(1,2,2);imshow(newI); xlabel('(b)迭代法分割效果图') %程序OK 没问题
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 部分 图像 分割 方法 matlab