2019-05-12 09:29:51 qq_41323793 阅读数 258

图像膨胀与腐蚀

作用区域:腐蚀与膨胀是对白色部分(高亮部分)而言,不是黑色部分。膨胀类似于“领域扩张”,腐蚀类似于“领域被蚕食”。

元素:设X是一个图像,B是一个矩阵。X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象地称做刷子。结构元素通常都是一些比较小的图象。

基础关系:

      1.B击中X

      若存在这样一个点,它即是B的元素,又是X的元素,则称B击中(hit)X,记作B↑X。如图1.1。

      2. B包含于X

     设有两幅图象B,X。对于B中所有的元素ai,都有ai∈X,则称B包含于(included in)X,记作B  X。如图1.2。

 图1.1         击中   图1.2       包含

膨胀

原理:

将结构元素通过平移与图像每个点进行比对,即结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。所有满足上述条件的a点组成的集合称做X被B膨胀的结果。如图1.3。

注意:

击中很好理解,但是击中之后,是对操作点保留,即如图1.4,将平移后的B中origin涂成黑色。(之前一直被我忽略,多次看才明白的地方)。

 

图1.3   膨胀示意图 图1.4 膨胀像素图

图1.5   容易理解的膨胀操作图

 

腐蚀

原理:

把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。是腐蚀的对偶操作,这一点可以好好利用。可以参考下图分析不同。

图1.6 腐蚀的示意图 图1.7 腐蚀的像素图
图1.8 生动形象的腐蚀操作图

发现

结构元素是一个可以自定义大小与内容的矩阵,它是导致我们结果多样的关键因素。如图1.9我们可以看到,使用13*13的结构元素,就将边长小于13的白色方块过滤成黑色了,只保留了边长大于13(边长为15)的白色方块。

另外在以上我们介绍的结构元素都是方方正正的,这导致我们的图像十分整齐,没有变形情况发生。在如图1.10中,我们引入了长方形的结构元素,发现图像X有变形情况,这很神奇,但是又合乎情理。

图1.9  使用形态学腐蚀去掉图像的某些部分
图1.10  使用非方正的结构元素进行腐蚀操作

开操作与闭操作

开操作

原理:先腐蚀再膨胀

效果:开操作可以用来消除小物体,在纤维点处可分离。开运算带来的结果是放大了裂缝或者局部低亮度的区域,使轮廓线更光滑。(这很好理解,先腐蚀图像X导致其细小的的连接消失不见,所以膨胀时,图像X就只有几个相对较大的模块。结果就是小物体消失了。)

几何解释:为了光滑的轮廓线,丢掉一些边边角角。如图1.11。

闭操作

原理:先膨胀再腐蚀

效果:与开操作相反,能够填补消除小型黑洞(黑色区域),并填补轮廓线中的断裂,使轮廓线更光滑。

几何解释:为了光滑的轮廓线,填了一些坑。如图1.12。

图1.11  开操作几何解释
图1.12 闭操作的几何解释

注意

1. 无论是开操作还是闭操作,算子应用一次之后,一个集合无论进行多少次的开操作或闭操作,操作都不会产生任何变化。

2. 按照《数字图像处理》第九章指纹示例所讲,开操作在消除白色噪声的同时,有几率使白色指纹连接线变得断断续续。这时我们可以在开操作的结果图上进行一次闭操作,将断续的白色指纹线连起来一些。 如图1.13。

其原因是“背景噪声在开操作的腐蚀过程中被完全消除了,因为在这种情况下,图像中的噪声部分的物理尺寸均比结构元素小。而包含于指纹中的噪声元素(黑点)的尺寸却有增加。原因是,当目标被腐蚀时,这些元素被作为应该增大尺寸的内部边界进行了处理。这种增大在闭操作的膨胀的过程中抵消了。”

图1.13 有噪声指纹的开操作闭操作

博主学习参考的博客有:

https://blog.csdn.net/E01114255/article/details/76091243

https://blog.csdn.net/junpengxue/article/details/79958651#commentsedit

https://blog.csdn.net/hanshanbuleng/article/details/80632612

 

2019-01-09 20:22:10 qq_42887760 阅读数 854

形态学操作(morphology operators)-膨胀与腐蚀(Dilation与Erosion)。

  • 图像形态学操作
    • 图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
    • 形态学有四个基本操作:腐蚀、膨胀、开、闭
    • 膨胀与腐蚀是图像处理中最常用的形态学操作手段
    • 腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。
  • 膨胀与腐蚀能实现多种多样的功能,主要如下:
    • 消除噪声
    • 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
    • 寻找图像中的明显的极大值区域或极小值区域
    • 求出图像的梯度
相关的 API

getStructuringElement(int shape, Size ksize, Point anchor)

  • 形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
  • 大小
  • 锚点 默认是Point(-1, -1)意思就是中心像素

1. 形态学操作-膨胀

  • 相关的API:dilate(src, dst, kernel);
    在这里插入图片描述
  • 跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状
  • 形态学操作-膨胀(感官上图像变细,变白了)
    在这里插入图片描述

2. 形态学操作-腐蚀

  • 相关的API:erode(src, dst, kernel)
    在这里插入图片描述
  • 腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值
  • 形态学操作-腐蚀(感官上图像变粗,变黑了)

在这里插入图片描述

动态调整结构元素大小

  • TrackBar –
    createTrackbar(const String & trackbarname, const String winName, int* value, int count, Trackbarcallback func, void* userdata=0)
    其中最中要的是 callback 函数功能。如果设置为NULL就是说只有值update,但是不会调用callback的函数。

代码示例

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;

Mat src,erode_dst,dilate_dst;
char input_Win[]="input windows",dilate_Win[]="Dilation windows",Erode_Win[]="Erosion windows";
int dilate_elem=0,erode_elem=0;
int dilate_size=0,erode_size=0;
int const max_elem=2;
int const max_kernel_size=21;

void Dilation(int,void*);//膨胀
void Erosion(int,void*);//腐蚀

int main(int argc,char** argv){
	//1、加载图像,可以是BGR或灰度
	src = imread("E:/Experiment/OpenCV/Pictures/lenanoise.jpg");
	if(src.empty()){
		printf("Could not load Image ...");
		return -1;
	}

	namedWindow(input_Win,CV_WINDOW_AUTOSIZE);
	imshow(input_Win,src);
	
	//2、创建两个窗口(一个用于膨胀Dilation,另一个用于侵蚀Erosion)
	//每次移动任何滑块时,都会调用用户的Erosion或Dilation函数,它将根据当前的trackbar值更新输出图像。
	namedWindow(dilate_Win,CV_WINDOW_AUTOSIZE);
	namedWindow(Erode_Win,CV_WINDOW_AUTOSIZE);
	
	//3、为每个操作创建两组轨道栏:
	
	//3.1、第一个轨道栏“Element”返回erosion_elem或dilation_elem
	createTrackbar("卷积核类型",dilate_Win,&dilate_elem,max_elem,Dilation);
	//3.2、第二个轨道栏“内核大小”返回相应操作的erosion_size或dilation_size。
	createTrackbar("卷积核大小",dilate_Win,&dilate_size,max_kernel_size,Dilation);
	
	
	createTrackbar("卷积核类型",Erode_Win,&erode_elem,max_elem,Erosion);
	createTrackbar("卷积核大小",Erode_Win,&erode_size,max_kernel_size,Erosion);

	Dilation( 0, 0 );
	Erosion( 0, 0 );

	waitKey(0);
}

//膨胀
void Dilation(int,void*){
	int dilate_type;//内核选择三种形状中的任何一种
	if(dilate_elem == 0){ dilate_type = MORPH_RECT; }//矩形内核:MORPH_RECT
	else if(dilate_elem == 1){ dilate_type = MORPH_CROSS; }//十字架内核:MORPH_CROSS
	else if(dilate_elem == 2){ dilate_type = MORPH_ELLIPSE; }//椭圆内核:MORPH_ELLIPSE

	Mat kernel = getStructuringElement(dilate_type,Size(2*dilate_size+1,2*dilate_size+1),Point(dilate_size,dilate_size));
	dilate(src,dilate_dst,kernel);
	imshow( dilate_Win, dilate_dst );
}

//腐蚀
void Erosion(int,void*){
	int erosion_type;//内核选择三种形状中的任何一种
	if(erode_elem == 0){ erosion_type = MORPH_RECT; }//矩形内核:MORPH_RECT
	else if(erode_elem == 1){ erosion_type = MORPH_CROSS; }//十字架内核:MORPH_CROSS
	else if(erode_elem == 2){ erosion_type = MORPH_ELLIPSE; }//椭圆内核:MORPH_ELLIPSE

	Mat kernel = getStructuringElement(erosion_type,Size(2*erode_size+1,2*erode_size+1),Point(erode_size,erode_size));
	erode(src,erode_dst,kernel);
	imshow( Erode_Win, erode_dst );
}

在这里插入图片描述

推荐参考:

  1. https://blog.csdn.net/LYKymy/article/details/83153122
  2. https://blog.csdn.net/huanghuangjin/article/details/80945770
2018-10-31 15:11:11 Eastmount 阅读数 8199

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

同时推荐作者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

前文参考:
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
[Python图像处理] 二.OpenCV+Numpy库读取与修改像素
[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
[Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
[Python图像处理] 五.图像融合、加法运算及图像类型转换
[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
[Python图像处理] 七.图像阈值化处理及算法对比

本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法,基础性知识希望对您有所帮助。
1.基础理论
2.图像腐蚀代码实现
3.图像膨胀代码实现

PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。

PSS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云lilizong老师的视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。

PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

一. 基础知识

(注:该部分参考作者论文《一种改进的Sobel算子及区域择优的身份证智能识别方法》)

图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大;腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。

1.图像膨胀
膨胀的运算符是“⊕”,其定义如下:

该公式表示用B来对图像A进行膨胀处理,其中B是一个卷积模板或卷积核,其形状可以为正方形或圆形,通过模板B与图像A进行卷积计算,扫描图像中的每一个像素点,用模板元素与二值图像元素做“与”运算,如果都为0,那么目标像素点为0,否则为1。从而计算B覆盖区域的像素点最大值,并用该值替换参考点的像素值实现膨胀。下图是将左边的原始图像A膨胀处理为右边的效果图A⊕B。
处理结果如下图所示:

2.图像腐蚀
腐蚀的运算符是“-”,其定义如下:

该公式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图所示,将左边的原始图像A腐蚀处理为右边的效果图A-B。
处理结果如下图所示:


二. 图像腐蚀代码实现

1.基础理论
形态学转换主要针对的是二值图像(0或1)。图像腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。其主要包括两个输入对象:
(1)二值图像
(2)卷积核
卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。换句话说,遍历到的黄色点位置,其周围全部是白色,保留白色,否则变为黑色,图像腐蚀变小。

2.函数原型
图像腐蚀主要使用的函数为erode,其原型如下:
dst = cv2.erode(src, kernel, iterations)
参数dst表示处理的结果,src表示原图像,kernel表示卷积核,iterations表示迭代次数。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

注意:迭代次数默认是1,表示进行一次腐蚀,也可以根据需要进行多次迭代,进行多次腐蚀。

3.代码实现
完整代码如下所示:

#encoding:utf-8
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('test01.jpg', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((5,5), np.uint8)

#图像腐蚀处理
erosion = cv2.erode(src, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

由图可见,干扰的细线被进行了清洗,但仍然有些轮廓,此时可设置迭代次数进行腐蚀。

erosion = cv2.erode(src, kernel,iterations=9)

输出结果如下图所示:



三. 图像膨胀代码实现

1.基础理论
图像膨胀是腐蚀操作的逆操作,类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,线条变粗了,主要用于去噪。
(1) 图像被腐蚀后,去除了噪声,但是会压缩图像。
(2) 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。

它也包括两个输入对象:
(1)二值图像或原始图像
(2)卷积核
卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则为0

2.函数原型
图像膨胀主要使用的函数为dilate,其原型如下:
dst = cv2.dilate(src, kernel, iterations)
参数dst表示处理的结果,src表示原图像,kernel表示卷积核,iterations表示迭代次数。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

注意:迭代次数默认是1,表示进行一次膨胀,也可以根据需要进行多次迭代,进行多次膨胀。通常进行1次膨胀即可。

3.代码实现
完整代码如下所示:

#encoding:utf-8
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((5,5), np.uint8)

#图像膨胀处理
erosion = cv2.dilate(src, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下所示:

图像去噪通常需要先腐蚀后膨胀,这又称为开运算,下篇文章将详细介绍。如下图所示:
erosion = cv2.erode(src, kernel)
result = cv2.dilate(erosion, kernel)

希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。最近经历的事情太多,有喜有悲,关闭了朋友圈,希望通过不断学习和写文章来忘记烦劳,将忧郁转换为动力。哎,总感觉自己在感动这个世界,帮助所有人,而自己却…保重。
(By:Eastmount 2018-10-31 下午4点 https://blog.csdn.net/Eastmount/)

2015-03-16 14:33:41 embedclub_LYF 阅读数 2630

在数字图像处理中,图像的形态学变换占有很重要的地位。基本的形态转换就是膨胀和腐蚀,它们能实现多种功能:例如消除噪声、分割出独立的图像元素以及在图像中连接相邻的元素。当然形态学也常备用于求出图像的梯度。

一. 关键函数介绍

下面就介绍OpenCV中对图像进行二值化的关键函数

cvErode()

函数功能:对图像进行腐蚀

函数原型:void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

函数说明:

src:输入图像.
dst:输出图像.
element:用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations:腐蚀的次数
cvDilate()
函数功能:对图像进行膨胀
函数原型:void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
函数说明:
src输入图像.
dst输出图像.
element结构元素。若为 NULL, 则使用默认的3×3 长方形,锚点在中间的结构元素,进行膨胀运算
iterations膨胀的次数

二. 示例程序代码

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

const char *pstrSrcWindowsTitle = "原图";
const char *pstrDestWindowsTitle_1 = "对原图腐蚀之后";
const char *pstrDestWindowsTitle_2 = "对原图膨胀之后";
const char *pstrDestWindowsTitle_3 = "对腐蚀过的图片作膨胀";

int main(int argc, char *argv[]){
	IplImage * src_image = cvLoadImage(argv[1]);//加载图片
	cvNamedWindow(pstrDestWindowsTitle_1, CV_WINDOW_AUTOSIZE);//创建窗口用于显示
	cvNamedWindow(pstrSrcWindowsTitle, CV_WINDOW_AUTOSIZE);
	cvShowImage(pstrSrcWindowsTitle, src_image);//显示原图

	//创建两个图片空间用于存放变换过的图片
	IplImage * out_image = cvCreateImage(cvGetSize(src_image),
		IPL_DEPTH_8U,
		3);

	IplImage * out_image_2 = cvCreateImage(cvGetSize(src_image),
		IPL_DEPTH_8U,
		3);

	cvDilate(src_image, out_image, NULL, 2);//膨胀处理,并显示
	cvShowImage(pstrDestWindowsTitle_2, out_image);

	cvErode(src_image, out_image,NULL,2);//腐蚀处理,并显示
	cvShowImage(pstrDestWindowsTitle_1, out_image);

	cvDilate(out_image, out_image_2, NULL, 2);//对腐蚀过的图像再膨胀
	cvShowImage(pstrDestWindowsTitle_3, out_image_2);
	
	waitKey(0);
	return 0;
}





2018-11-23 11:53:15 DKhadoop 阅读数 343

 

图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大;腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。

1.图像膨胀

膨胀的运算符是“⊕”,其定义如下:

 

该公式表示用B来对图像A进行膨胀处理,其中B是一个卷积模板或卷积核,其形状可以为正方形或圆形,通过模板B与图像A进行卷积计算,扫描图像中的每一个像素点,用模板元素与二值图像元素做“与”运算,如果都为0,那么目标像素点为0,否则为1。从而计算B覆盖区域的像素点最大值,并用该值替换参考点的像素值实现膨胀。下图是将左边的原始图像A膨胀处理为右边的效果图A⊕B。

 

2.图像腐蚀

腐蚀的运算符是“-”,其定义如下:

 

该公式表示图像A用卷积模板B来进行腐蚀处理,通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。如图所示,将左边的原始图像A腐蚀处理为右边的效果图A-B。

 

处理结果如下图所示:

 

  • 图像腐蚀代码实现

1.基础理论

形态学转换主要针对的是二值图像(0或1)。图像腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。其主要包括两个输入对象:

(1)二值图像

(2)卷积核

卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

 

被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则其值修改为0。换句话说,遍历到的黄色点位置,其周围全部是白色,保留白色,否则变为黑色,图像腐蚀变小。

 

2.函数原型

图像腐蚀主要使用的函数为erode,其原型如下:

dst = cv2.erode(src, kernel, iterations)

参数dst表示处理的结果,src表示原图像,kernel表示卷积核,iterations表示迭代次数。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

 

注意:迭代次数默认是1,表示进行一次腐蚀,也可以根据需要进行多次迭代,进行多次腐蚀。

3.代码实现

完整代码如下所示:

 

输出结果如下图所示:

 

由图可见,干扰的细线被进行了清洗,但仍然有些轮廓,此时可设置迭代次数进行腐蚀。

erosion = cv2.erode(src, kernel,iterations=9)

输出结果如下图所示:

 

 

三. 图像膨胀代码实现

1.基础理论

图像膨胀是腐蚀操作的逆操作,类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,线条变粗了,主要用于去噪。

(1) 图像被腐蚀后,去除了噪声,但是会压缩图像。

(2) 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。

 

它也包括两个输入对象:

(1)二值图像或原始图像

(2)卷积核

卷积核是腐蚀中的关键数组,采用numpy库可以生成。卷积核的中心点逐个像素扫描原始图像,如下图所示:

被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则为0。

2.函数原型

图像膨胀主要使用的函数为dilate,其原型如下:

dst = cv2.dilate(src, kernel, iterations)

参数dst表示处理的结果,src表示原图像,kernel表示卷积核,iterations表示迭代次数。下图表示5*5的卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。

 

注意:迭代次数默认是1,表示进行一次膨胀,也可以根据需要进行多次迭代,进行多次膨胀。通常进行1次膨胀即可。

3.代码实现

完整代码如下所示:

 

输出结果如下所示:

 

图像去噪通常需要先腐蚀后膨胀,这又称为开运算,下篇文章将详细介绍。如下图所示:

erosion = cv2.erode(src, kernel)

result = cv2.dilate(erosion, kernel)

 

 

 

没有更多推荐了,返回首页