说明:利用彩色图像的处理方法和数学形态学方法,

  • 虫虫123456
    了解作者
  • matlab
    开发工具
  • 733.5KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 5 积分
    下载积分
  • 0
    下载次数
  • 2022-06-15 23:30
    上传日期
说明:利用彩色图像的处理方法和数学形态学方法,
MATLAB编程.rar
  • MATLAB编程
  • 图像1.tif
    2.8MB
  • shengwuxinpiantuxiangfenxi.m
    4.7KB
  • removebigarea.m
    2.7KB
内容介绍
%读取图像 F1=imread('图像1.tif'); [m,n]=size(F1); %平滑处理 F11=histeq(F1);%由于原图像ROI灰度过低,因此灰度均衡化 f=im2double(F11); g=fft2(f);%傅里叶变换 g=fftshift(g);%直流分量移到频谱中心 [M,N]=size(g);%计算图像的高和宽 d0=40;nn=2;%截止频率为50的二阶巴特沃斯低通滤波器 mk=round(M/2);nk=round(N/2);%数据取整 for i=1:M for j=1:N d=sqrt((i-mk)^2+(j-nk)^2);%计算频率平面原点到各点的距离 h=1/(1+0.414*(d/d0)^(2*nn));%传递公式 result(i,j)=h*g(i,j);%滤波公式 end end result=ifftshift(result);%直流分量移回到左上角 I2=ifft2(result);%傅里叶反变换 I3=uint16(real(I2));%取幅值并转换成16位无符号整数 %确定芯片有效区域 %先确定较大区域;(由于ROI外围有一圈黑色的边缘,因此此步骤主要是为了能进一步处理ROI,确定一个比ROI略大的区域) FI=im2bw(I3);%二值化 FI1=bwmorph(FI,'thicken');%加粗轮廓 FI2=bwareaopen(FI1,52500,8);%去掉面积小于52500的连通域 FI3=bwmorph(FI2,'close');%闭运算 FI4=1-FI3;%反转灰度 FI5=bwareaopen(FI4,272500,8);%去掉面积小于272500的连通域 FI6=1-bwmorph(FI5,'dilate',15);%进行15次膨胀后反转灰度 FI7=1-bwareaopen(FI6,500000,8);%去掉面积小于500000的连通域后再反转灰度 %从较大区域中提取芯片有效区域; FT=uint16(FI7); FT1=I3.*FT;%即用原图有确定的较大区域的二值化的图做一个与运算,这样,非ROI区域的灰度值都为0 %将图像分为四个部分,分别做二值化;(避免灰度不均匀带来的二值化结果太差) mc=round(m/2);nc=round(n/2); FTf1=FT1(1:mc,1:nc+200); FTf2=FT1(mc+1:m,1:nc); FTf3=FT1(1:mc,nc+201:n); FTf4=FT1(mc+1:m,nc+1:n); FT2f1=im2bw(FTf1,0.19); FT2f2=im2bw(FTf2,0.19); FT2f3=im2bw(FTf3,0.40); FT2f4=im2bw(FTf4,0.19); %将四个部分整合,并进行形态学运算 FT3(1:mc,1:nc+200)=FT2f1; FT3(mc+1:m,1:nc)=FT2f2; FT3(1:mc,nc+201:n)=FT2f3; FT3(mc+1:m,nc+1:n)=FT2f4; FT4=bwareaopen(FT3,20000,8); FT5=bwareaopen(1-FT4,20000,8); FT6=1-bwmorph(FT5,'dilate',10);%10次膨胀并取反 FT7=bwareaopen(FT6,120000,8);%去掉小于1200000的连通域 FT8=bwmorph(FT7,'dilate',10);%10次膨胀,由于之前是10次取反膨胀,因此得到的有效区域面积基本一致 %定位芯片区域后,对芯片样品池进行识别 FS=uint16(FT8); FS1=F1.*FS; FS2=FS1; %以4*4为步长,分区域进行二值化(光照不均匀,直接进行二值化,样品池会产生连结) for ii=1:4:n-4 for jj=1:4:m-4 avFS2=mean(mean(FS2(jj:jj+3,ii:ii+3))); FS2(jj:jj+3,ii:ii+3)=FS2(jj:jj+3,ii:ii+3).*uint16((FS2(jj:jj+3,ii:ii+3)>100*avFS2/99))*65536;%4*4区域内,以平均值的100/99作为阈值 end end %对得到的样品池的二值化图像进行形态学运算 FS3=removebigarea(FS2,20,4);%此函数就是在bwareaopen的基础上修改了大于和小于的关系,表达的是去掉图像中大于20的连通域 FS4=bwareaopen(FS3,8,4);%去掉图像中小于8的连通域 %对原图进行处理 %计算整体样品池灰度平均值 FZ=F1.*uint16(FS4); L=bwlabel(FS4);%给连通域编号 %计算每一连通域内的平均灰度值,并存至一矩阵 numL=max(max(L)); meanHD=[]; for il=1:numL [mean_hd_x,mean_hd_y]=find(L==il); mean_hd=mean(mean(FZ(mean_hd_x,mean_hd_y))); meanHD=[meanHD,mean_hd]; end %分区域判断阴性和阳性点,模板为50*50(光照不均匀带来影响),以50*50区域内的连通域分别的灰度平均值的平均值作为一个阈值来判断是否为阳性点 PL=[]; for kyy=1:50:m-50 for kxx=1:50:n-50 SUM_mean_HD=[]; kkk=[]; for idsy=0:1:49 for idsx=0:1:49 if L(idsy+kyy,idsx+kxx)>0 if find(kkk==L(idsy+kyy,idsx+kxx))>=1 continue; else SUM_mean_HD=[SUM_mean_HD meanHD(L(idsy+kyy,idsx+kxx))]; kkk=[kkk L(idsy+kyy,idsx+kxx)]; end end end end mean_SUM=mean(SUM_mean_HD); for ids=1:1:max(size(SUM_mean_HD)) if SUM_mean_HD(ids)>mean_SUM PL=[PL kkk(ids)]; end end end end %获取阳性连通域的质心坐标 centerL=regionprops(L,'Centroid'); NPCenter=[]; for icc=1:max(size(PL)) NPCenter=round([NPCenter;centerL(PL(icc)).Centroid]); end %展示与图中标识 %将有效区域边界画成红色 COLOR1 = [65536, 0, 0]; FK=edge(FS,'canny'); FK1=bwmorph(FK,'dilate',3); r = F1; g = F1; b = F1; r(FK1) = COLOR1(1); g(FK1) = COLOR1(2); b(FK1) = COLOR1(3); FK2=cat(3, r, g, b); %将矩阵r,g,b串联 %将阳性样品池以绿色标记出来 COLOR2 = [0, 65536, 0]; for ishow=1:max(size(PL)) r(NPCenter(ishow,2)-1:NPCenter(ishow,2)+1,NPCenter(ishow,1)-1:NPCenter(ishow,1)+1) = COLOR2(1); g(NPCenter(ishow,2)-1:NPCenter(ishow,2)+1,NPCenter(ishow,1)-1:NPCenter(ishow,1)+1) = COLOR2(2); b(NPCenter(ishow,2)-1:NPCenter(ishow,2)+1,NPCenter(ishow,1)-1:NPCenter(ishow,1)+1) = COLOR2(3); end FK3=cat(3, r, g, b); %在图中以文字注明统计的阳性点数 ishow=num2str(ishow); figure; imshow(FK3); text(160,180,' 有效区域\rightarrow ','FontSize',18,'color','yellow'); text(400,910,' 统计阳性点数为: ','FontSize',18,'color','yellow'); text(800,910,ishow,'FontSize',18,'color','yellow');
评论
    相关推荐