形态学操作实现

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

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

实验结果:

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

实验结果:

代码:(下载链接)

%本实验完成对二值图像和灰度图像的腐蚀、膨胀、开、闭操作
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(‘闭结果‘);
 

function O=myimclose(I,se,type)
%%闭操作
%I:输入图像(二值或灰度)
%se:结构元
%type:图像类型(gray、binary)
%O:闭操作结果
O=myimerode(myimdilate(I,se,type),se,type);

function O=myimopen(I,se,type)
%开操作
%I:输入图像(二值或灰度)
%se:结构元
%type:图像类型(gray、binary)
%O:开操作结果
O=myimdilate(myimerode(I,se,type),se,type);

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

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

时间: 2024-10-09 08:04:36

形态学操作实现的相关文章

OPENCV形态学操作1

形态学操作是指基于形状的一系列图像处理操作,包括膨胀,腐蚀,二值化,开运算,闭运算,顶帽算法,黑帽算法,形态学梯度等,最基本的形态学操作就是膨胀和腐蚀. 一.膨胀 首先需要明确一个概念,膨胀和腐蚀都是针对于图像中较亮的区域而言的,膨胀就是亮的区域变多了,而腐蚀就是暗的区域变多了. 膨胀的功能主要有消除噪声,分割出独立的图像元素,在图像操作的时候,有时候需要对图像中的某些形状进行检测,而这些形状相互连接在一起,不好分开检测,膨胀就能切开这些形状(很小的连接位置),或者图像中有很小块的黑斑,或许是相

EasyPR--开发详解(4)形态学操作、尺寸验证、旋转等操作

在上一篇深度分析与调优讨论中,我们介绍了高斯模糊,灰度化和Sobel算子.在本文中,会分析剩余的定位步骤. 根据前文的内容,车牌定位的功能还剩下如下的步骤,见下图中未涂灰的部分. 图1 车牌定位步骤 我们首先从Soble算子分析出来的边缘来看.通过下图可见,Sobel算子有很强的区分性,车牌中的字符被清晰的描绘出来,那么如何根据这些信息定位出车牌的位置呢? 图2 Sobel后效果 我们的车牌定位功能做了个假设,即车牌是包含字符图块的一个最小的外接矩形.在大部分车牌处理中,这个假设都能工作的很好.

cvMorphologyEx 形态学操作:开闭运算,形态学梯度,礼帽和黑帽

1.开运算:CV_MOP_OPEN,先腐蚀(cvErode)再膨胀(cvDilate),去除亮点,可以将做了阀值化细胞图像的细胞分开 2.闭运算:CV_MOP_CLOSE,先膨胀(cvDilate)再cvErode,去除暗点 3.形态学梯度:cvDilate-cvErode,用于求边界 4.礼帽:src-开运算,突出亮点 5.黑帽:闭运算-src,突出暗点 程序: 代码: #include "cv.h" #include "cxcore.h" #include &q

基于形态学操作提取水平和垂直线条

目的: 结合自定义核,应用两个非常常见的形态学算子(例如,扩张和侵蚀),提取水平和垂直方向的线条.将会用到以下OpenCV函数: cv::erode cv::dilate cv::getStructuringElement 接下里的例子是从乐谱中提取音符(五线谱中音符和乐谱线的分离) 理论 Morphology Operations 形态学是一组图像处理操作, 基于预定义的structuring elements(也被称为核).输出图像中的每个像素的值是基于中心像素与输入图像中相邻像素的值的比较

图像形态学操作—腐蚀膨胀深入

这里我们主要想讲解冈萨雷斯的数字图像处理这本书上膨胀腐蚀的定义及用opencv实现的结果,然后对比它们之间的差异. 一:opencv实现 在这之前可以看我的另外一篇blog:http://blog.csdn.net/lu597203933/article/details/17184439 膨胀: 案例代码: int main() { int a[8][8] = { {0,0,0,0,0,0,0,0}, {0,0,5,1,0,0,1,1}, {0,1,0,1,0,1,0,0}, {0,1,1,2,

二十 形态学操作

介绍 形态学操作其实就是改变物体的形状,比如腐蚀就是"变瘦",膨胀就是"变胖",看下图就明白了 形态学操作一般作用于二值化图,来连接相邻的元素或分离成独立的元素.腐蚀和膨胀是针对图片中的白色部分! 主要是应用在二值图像分析中,灰度图像亦可. 可以看做膨胀是将白色区域扩大,腐蚀是将黑色区域扩大 一.膨胀与腐蚀 相关函数 def getStructuringElement(shape, ksize, anchor=None): # real signature unkn

opencv学习记录之形态学操作

腐蚀和膨胀是形态学运算的基础,将腐蚀和膨胀进行组合运算,通过不同的组合可以实现不同的效果,需要自行开发则可以实现开运算,闭运算,形态学梯度运算,礼帽运算 黑帽运算,击中击不中运算等不同形式的运算 函数形式 dst = cv2.morphologyEx( src , op , kernel [ , anchor [ , interations [, borderType [ , borderValue]]]]) dst 形态学操作之后的图像,与原图像类型大小相同 src需要操作的图像,与之腐蚀和膨

图像形态学操作

形态学-腐蚀操作 img = cv2.imread('dige.png') cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() kernel = np.ones((3,3),np.uint8) erosion = cv2.erode(img,kernel,iterations = 1) cv2.imshow('erosion', erosion) cv2.waitKey(0) cv2.destroyAllWindows()

【温故知新】形态学操作

腐蚀:用一个结构元素(一般是3×3的大小)扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为1,则该像素为1,否则为0. 膨胀:用一个结构元素(一般是3×3的大小)扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为0,则该像素为0,否则为1. 开:先腐蚀后膨胀.“容易记的话,开最后落在扩大上,所以是膨胀” 闭:先膨胀后腐蚀.“容易记的话,闭最后落在缩小上,所以是腐蚀” 腐蚀:名为腐蚀,肯定是缩小的趋势,能够缩小边界,去除噪点: