zoukankan      html  css  js  c++  java
  • 形态学操作实现

    数学形态学的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的基本运算有四个:腐蚀、膨胀、开和闭。基于这些基本运算还可以推导和组合成各种数学形态学实用算法。本实验分别实现针对二值图像和灰度图像的四种形态学操作。

    一、二值图像的腐蚀、膨胀、开、闭操作

    实验结果:

    二、灰度图像的腐蚀、膨胀、开、闭操作

    实验结果:

    代码:(下载链接)

    %本实验完成对二值图像和灰度图像的腐蚀、膨胀、开、闭操作
    close all;
    clear all;
    grayI = imread('rice.png');
    binI=im2bw(grayI,0.5);%转二值图
    se = [0,1,0;1,1,1;0,1,0]; %结构元
    binIerode  = myimerode(binI,se,'binary');
    binIdilate = myimdilate(binI,se,'binary');
    binIopen   = myimopen(binI,se,'binary');
    binIclose  = myimclose(binI,se,'binary');
    grayIerode = myimerode(grayI,se,'gray');
    grayIdilate= myimdilate(grayI,se,'gray');
    grayIopen  = myimopen(grayI,se,'gray');
    grayIclose = myimclose(grayI,se,'gray');
    figure;
    subplot(2,3,1);imshow(binI);title('原始二值图');
    subplot(2,3,2);imshow(binIerode);title('腐蚀结果');
    subplot(2,3,3);imshow(binIdilate);title('膨胀结果');
    subplot(2,3,4);imshow(binIopen);title('开结果');
    subplot(2,3,5);imshow(binIclose);title('闭结果')
    figure;
    subplot(2,3,1);imshow(grayI);title('原始灰度图');
    subplot(2,3,2);imshow(uint8(grayIerode));title('腐蚀结果');
    subplot(2,3,3);imshow(uint8(grayIdilate));title('膨胀结果');
    subplot(2,3,4);imshow(uint8(grayIopen));title('开结果');
    subplot(2,3,5);imshow(uint8(grayIclose));title('闭结果');
     
    View Code
    function O=myimclose(I,se,type)
    %%闭操作
    %I:输入图像(二值或灰度)
    %se:结构元
    %type:图像类型(gray、binary)
    %O:闭操作结果
    O=myimerode(myimdilate(I,se,type),se,type);
    View Code
    function O=myimopen(I,se,type)
    %开操作
    %I:输入图像(二值或灰度)
    %se:结构元
    %type:图像类型(gray、binary)
    %O:开操作结果
    O=myimdilate(myimerode(I,se,type),se,type);
    View Code
    function O=myimerode(I,se,type)
    %%腐蚀操作
    %I:输入图像(二值或灰度)
    %se:结构元
    %type:图像类型(gray、binary)
    %O:腐蚀操作结果
    O=zeros(size(I));
    [r,c]=size(I);
    [m,n]=size(se);
    lm=floor((m-1)/2);
    ln=floor((n-1)/2);
    rm=m-lm-1;
    rn=n-ln-1;
    orgm=lm+1;%结构元原点
    orgn=ln+1;
    if(strcmp(type,'binary'))%二值图像
        for i=1:r
            for j=1:c
                indexr=max(1,i-lm):min(r,i+rm);%边界处理
                indexc=max(1,j-ln):min(c,j+rn);
                if(sum(sum(se(indexr-i+orgm,indexc-j+orgn)&I(indexr,indexc)))==sum(sum(se(indexr-i+orgm,indexc-j+orgn))))
                    O(i,j)=1;
                end
            end
        end
    end
    if(strcmp(type,'gray'))%灰度图像
        I=double(I);
        for i=1:r
            for j=1:c
                indexr=max(1,i-lm):min(r,i+rm);%边界处理
                indexc=max(1,j-ln):min(c,j+rn);
                O(i,j)=min(min(I(indexr,indexc)-se(indexr-i+orgm,indexc-j+orgn)));
            end
        end
    end
    View Code
    function O=myimdilate(I,se,type)
    %%膨胀操作
    %I:输入图像(二值或灰度)
    %se:结构元
    %type:图像类型(gray、binary)
    %O:膨胀操作结果
    se=reflect(se);%结构元反射
    O=zeros(size(I));
    [r,c]=size(I);
    [m,n]=size(se);
    lm=floor(m/2);%区别于erode
    ln=floor(n/2);
    rm=m-lm-1;
    rn=n-ln-1;
    orgm=lm+1;%结构元原点
    orgn=ln+1;
    if(strcmp(type,'binary'))%二值图像
        for i=1:r
            for j=1:c
                indexr=max(1,i-lm):min(r,i+rm);%边界处理
                indexc=max(1,j-ln):min(c,j+rn);
                if(sum(sum(se(indexr-i+orgm,indexc-j+orgn)&I(indexr,indexc)))>=1)
                    O(i,j)=1;
                end
            end
        end
    end
    if(strcmp(type,'gray'))%灰度图像
        I=double(I);
        for i=1:r
            for j=1:c
                indexr=max(1,i-lm):min(r,i+rm);%边界处理
                indexc=max(1,j-ln):min(c,j+rn);
                O(i,j)=max(max(I(indexr,indexc)+se(indexr-i+orgm,indexc-j+orgn)));
            end
        end
    end
    
    function newse=reflect(se)
    %%结构元反射操作
    %se:输入结构元
    %newse:反射后结构元
    [m,n]=size(se);
    newse=zeros(m,n);
    for i=1:m
        for j=1:n
            newse(i,j)=se(m+1-i,n+1-j);
        end
    end
    View Code
  • 相关阅读:
    蘑菇街
    康拓展开
    CSS学习笔记
    专业名词
    专业名字
    01背包问题
    将bbr功能合入到centos7.3
    How to Identify User&Password of DataBase safely in SQL statement?
    tips for private constructor
    all Key Word of C#
  • 原文地址:https://www.cnblogs.com/luo-peng/p/5612449.html
Copyright © 2011-2022 走看看