【C++的OpenCV】第六课-OpenCV图像常用操作(三):OpenCV的图像的侵蚀和扩张


一、图像的侵蚀和扩张

本章节中我们将会学习到:

两个函数的基本使用方法和实例。

关于二者的用途:
1. 消除噪音,这里大家应该记得还有一个东西也是常用于降噪的(图像的模糊滤波处理
2. 隔离单个元素且链接图像中的不同元素
3. 查找图像中的强度凸点或者孔

1.1 侵蚀

1.1.1 函数原型


void cv::erode	(	
					InputArray 	src,
					OutputArray 	dst,
					InputArray 	kernel,
					Point 	anchor = Point(-1,-1),
					int 	iterations = 1,
					int 	borderType = BORDER_CONSTANT,
					const Scalar & 	borderValue = morphologyDefaultBorderValue() 
				)	
  • 参数解释
1、src:输入的图像;通道的数量可以是任意的,
	   		但是深度应该是CV_8U、CV_16U、CV_36S、CV_32F或CV_64F之一。
2、dst:依照输入图像经过处理后输出的图像(这里指侵蚀后)
3、kernel:用于侵蚀的结构原件;如果原件是Mat的对象(element=Mat(),
			则将会创建一个3x3大小的矩形结构原件。
			内核也可以通过getStructuringElement()去创建。
4、anchor:侵蚀内核元件的锚点,默认值是(-1,-1)即视为锚点在该内核的中心。
5、iterations:侵蚀被应用的次数
6、borderType:像素外延的方法,请参见BorderTypes。不支持BORDER_WRAP。
7、borderValue:边界的值(如果边界为等宽,即常量边界)

1.1.2 侵蚀的效果

在这里插入图片描述

1.1.3 关于侵蚀的解释

        通过一个特定的结构元素腐蚀一个图像。图像腐蚀的过程类似于一个卷积的过程,源图像矩阵A以及结构元素B,B在A矩阵上依次移动,每个位置上B所覆盖元素的最小值替换B的中心位置值(即锚点处),完成整个侵蚀的过程。
        扩张是一个道理。

1.2 扩张

1.2.1 函数原型


void cv::dilate	(	
					InputArray 	src,
					OutputArray 	dst,
					InputArray 	kernel,
					Point 	anchor = Point(-1,-1),
					int 	iterations = 1,
					int 	borderType = BORDER_CONSTANT,
					const Scalar & 	borderValue = morphologyDefaultBorderValue() 
				)	
  • 参数解释:
    完全同侵蚀(将“侵蚀”二字换成“扩展”即可)的函数参数解释!!参数说明

1.2.2 扩张的效果

在这里插入图片描述

二、实例

  • 以侵蚀为例:(扩展的代码类似)
#include <iostream>
#include <opencv2/opencv.hpp>

#define PATH_IMG  "D:\\opencvDemo\\imgs\\demo.png"

using namespace cv;
using namespace std;

int main()
{
    
    
	Mat img = imread(PATH_IMG);
	if (img.empty())
	{
    
    
		cout << "图像打开失败!" << endl;
		return 0;
	}
	Mat imgDst;
	//自定义核
	Mat element = getStructuringElement(cv::MORPH_RECT, Size(20, 20));
	imshow("原图", img);
	dilate(img, imgDst, element);
	imshow("扩张", imgDst);
	waitKey(0);
	return 0;
}
  • 效果
    原图:
    在这里插入图片描述

处理后的图片:
在这里插入图片描述

回到顶部

猜你喜欢

转载自blog.csdn.net/weixin_43520503/article/details/129194304