让我们继续
- 一、图像的侵蚀和扩张
- 1.1 侵蚀
- 1.1.1 函数原型
- 1.1.2 侵蚀的效果
- 1.1.3 关于侵蚀的解释
- 1.2 扩张
- 1.2.1 函数原型
- 1.2.2 扩张的效果
- 二、实例
一、图像的侵蚀和扩张
本章节中我们将会学习到:
- cv::erode() 函数详情
- cv::dilate() 函数详情
两个函数的基本使用方法和实例。
关于二者的用途:
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;
}
- 效果 原图:
处理后的图片: