Opencv学习笔记 图像分割一(极限腐蚀、条件膨胀)

这篇博客主要探讨了OpenCV库中极限腐蚀和条件膨胀操作在图像分割中的应用。通过参考代码1和代码2,作者展示了这两种技术在实际操作中可能达到的效果,并指出虽然分割效果可能不尽如人意,但它们仍然是图像处理领域中重要的图像分割方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        参考代码1:分割的效果不是太理想

clear all; 
close all; 
clc; 
[fname,pname]=uigetfile('*.*','open'); 
fullname=strcat(pname,fname); 
img_in=imread(fullname); 
figure 
subplot(3,3,1);imshow(img_in);title('彩图'); 
img_gray=rgb2gray(img_in);subplot(3,3,2);imshow(img_gray);title('灰度图'); 
img1=img_gray(85:205,177:380);subplot(3,3,3);imshow(img1);title('局部灰度图'); 
%img1=img_gray(105:185,170:380);img1(:,1:7)=255;subplot(3,3,3);imshow(img1);title('局部灰度图'); 
 
%img1=img_gray(50:400,180:380);subplot(3,3,3);imshow(img1);title('局部灰度图'); 
 
img1=im2bw(img1,graythresh(img1));subplot(3,3,4);imshow(img1);title('二值图'); 
img_before=~img1; 
subplot(3,3,5);imshow(img_before);title('待处理二值图'); 
%为了保证做极限腐蚀时不受边界突变凹坑的影响,先对整幅图像做一个边缘的光滑处理。 
%这里使用膨胀。这样做的话极限腐蚀后最终腐蚀的区域数只有三个,消去了由于边界不光 
%滑造成的影响。 
img=imdilate(img_before,ones(8,8));%使用膨胀法进行边界平滑。 
subplot(3,3,6);imshow(img);title('平滑结果'); 
% 
[m,n]=size(img); 
imgn=zeros(m,n); 
preimg=imgn; 
% 
se=strel('square',3);%stricture element. 
%开始 
while sum(sum(preimg-img))~=0  
    preimg=img; 
    img=img>0; 
    [img label]=bwlabel(img);      %标记不同区域,label是区域个数 
     
    imgn=imerode(img,se); 
    %腐蚀之后是否有哪个被标记的区域消失了 
    Hist=zeros(1,label);             
    for i=1:m 
        for j=1:n 
            if imgn(i,j)~=0 
                Hist(imgn(i,j))=imgn(i,j);   
            end 
        end 
    end 
    %统计消失区域的标号 
    H=[]; 
    for i=1:label 
        if Hist(i)==0 
            H=[H i];        
        end 
    end 
    %如果这个区域消失了,那么再把这个区域恢复过来 
    if ~isempty(H) 
        l=length(H); 
        for i=1:m 
            for j=1:n 
                for k=1:l 
                    if img(i,j)==H(k)    
                        imgn(i,j)=img(i,j); 
                    end 
                end 
            end 
        end    
    end     
    img=imgn; 
end 
a=label  %输出区域数量 
%^^^^^^^^^^^^^^^^^^^ 
subplot(3,3,7);imshow(img);title('最终腐蚀结果——“核”') 
%………………………………………………………… 
%此处先实验基于条件一的极限膨胀:不要超过原边界。 
mask=img_before; 
img1=img; 
[m,n]=size(img1); 
imgn1=zeros(m,n); 
preimg=imgn1; 
while sum(sum(preimg-img1))~=0 
    preimg=img1; 
    for i=2:m-1 
        for j=2:n-1 
            if mask(i,j)==1 
                imgn1(i,j)=max(max(img1(i-1:i+1,j-1:j+1))); 
            end 
        end 
    end 
    img1=imgn1; 
end 
% figure; 
% imshow(img1); 
% title('不超过边界膨胀') 
%………………………………………………………… 
%此处实验第二个规则:膨胀互不侵犯。 
img2=img;%拷贝“核”,这些核是被标记过得。 
% img22=img22>0; 
% img222=imdilate(img22,ones(3,3)); 
% img222=imdilate(img22,ones(3,3)); 
% img222=imdilate(img22,ones(3,3)); 
%  
% [img2,num]=bwlabel(img222); 
% a=num 
 
%  img2=zeros(m,n);%将核的形状改成正方形 
%  for i=1:label 
%       
%     [r,c]=find(img==i); 
%     rbar=mean(r); 
%     cbar=mean(c); 
%     img2(round(rbar),round(cbar))=i; 
%  end 
  
[m,n]=size(img2); 
 
subplot(3,3,8);imshow(img2);title('用于膨胀的目标区域'); 
 
 
 
imgn2=zeros(m,n); 
preimg2=imgn2; 
%对mask进行一下开运算,去除内部空洞的影响。 
mask1=imclose(mask,ones(3,3)); 
 
 
while sum(sum(preimg2-img2))~=0  %判断是否膨胀完全 
    preimg2=img2; 
    for i=2:m-1 
        for j=2:n-1 
            if img2(i,j)==0 && mask1(i,j)==1 
%             if img2(i,j)==0  
              flag=0; 
                 
                tmp=img2(i-1:i+1,j-1:j+1);%3*3区域 
                ma=max(tmp(:));%tmp(:)把tmp的各列串成一列。 
                mi=min(tmp(:)); 
                for k=1:9 
                    if tmp(k)~=ma && tmp(k)~=mi; 
                        flag=1; 
                       break; 
                        
                    end 
                end 
                 
                if flag==0 
                    imgn2(i,j)=ma; 
                end 
                 
            end 
        end 
    end 
     
    img2=imgn2; 
end 
 
% for i=2:m-1 
%     for j=2:n-1 
%         if img2(i,j)==0 
%             imgn2(i,j)=max(max(img(i-1:i+1,j-1:j+1))); 
%         end 
%     end 
% end 
 
subplot(3,3,9); 
imshow(imgn2);title('互不侵犯膨胀结果') 

        参考代码2:

I=imread('C:\Users\xiaomao\Desktop\water_coins.jpg');
II=rgb2gray(I);
th=graythresh(II);
I=1-im2bw(II, th);
R=separate1(I, 40);
figure; imshow(R);

function R=separate1(I,h)
    I=1-I;
    D=bwdist(I);
    %figure; imshow(max(D(:))-D, []);
    D=uint8(floor(D*255/max(D(:)) + 0.5));
    %figure; imshow(D);
    im = imreconstruct(D-h, D);
    %figure; imshow(im, []);
    dome=D-im;
    dome=im2bw(dome, graythresh(dome));
    dome=bwareaopen(dome,floor(h/2));
    gradmag2=imimposemin(255-D,dome);
    gradmag2(find(I==1))=0;
    DL=watershed(gradmag2);
    I(DL==0)=1;
    R=bwareaopen(1-I, 10);
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值