前言
本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档:https://blog.csdn.net/z634863434/article/details/89950961
概念
假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。而膨胀这个概念相对于下列图像来说,背景(白色255,255,255)为最大像素值,膨胀后,采取背景像素,图像变细了。
假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最小像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。而腐蚀这个概念相对于下列图像来说,图像(黑色0,0,0)为最小像素值,腐蚀后,采取图像像素,图像变粗了。
结构元素
函数原型:
Mat cv::getStructuringElement ( int shape,
Size ksize,
Point anchor = Point(-1,-1)
)
作用:生成结构元素,可作为膨胀和腐蚀的核
输入参数 | 参数定义 |
---|---|
shape | 元素形状,MORPH_RECT(矩阵) MORPH_CROSS(十字) MORPH_ELLIPSE(椭圆) |
ksize | 结构元素的大小 |
anchor | 锚点 |
膨胀
函数原型:
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()
)
作用:图像膨胀处理
输入参数 | 参数定义 |
---|---|
src | 输入图像 |
dst | 输出图像 |
kernel | 结构元素 |
anchor | 锚点 |
iterations | 应用膨胀的次数 |
borderType | 像素外推方法 |
borderValue | 边界值 |
腐蚀
函数原型:
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()
)
作用:图像腐蚀
输入参数 | 参数定义 |
---|---|
src | 输入图像 |
dst | 输出图像 |
kernel | 结构元素 |
anchor | 锚点 |
iterations | 应用腐蚀·的次数 |
borderType | 像素外推方法 |
borderValue | 边界值 |
示例
创建滑动条,对原图进行腐蚀和膨胀操作,根据滑动条的位置,腐蚀和膨胀的程度发生对应变化
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
#include <QtDebug>
using namespace cv;
Mat src,dst;
int element_size = 3;
int max_size = 21;
/*给滑动的回调函数(膨胀)*/
void CallBack_Demo_dilate(int,void*)
{
//设定结构元素的大小与滑动块系统相联系
int s = element_size * 2 + 1;
//创建结构元素
Mat structureElenent = getStructuringElement(MORPH_RECT,Size(s,s));
//膨胀操作
dilate(src,dst,structureElenent);
//显示画面
imshow("output Image dilate",dst);
}
/*给滑动的回调函数(腐蚀)*/
void CallBack_Demo_erode(int,void*)
{
//设定结构元素的大小与滑动块系统相联系
int s = element_size * 2 + 1;
//创建结构元素
Mat structureElenent = getStructuringElement(MORPH_RECT,Size(s,s));
//腐蚀操作
erode(src,dst,structureElenent);
//显示画面
imshow("output Image erode",dst);
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//读取图像
src = imread("E:/OpenCV/OpenCVPicture/horse.png");
if(src.empty()){
qDebug()<<"can not load image...\n";
return ;
}
//显示原始图像
namedWindow("input Image",CV_WINDOW_AUTOSIZE);
imshow("input Image",src);
//创建膨胀后图像的窗口
namedWindow("output Image dilate",CV_WINDOW_AUTOSIZE);
//创建腐蚀后图像的窗口
namedWindow("output Image erode",CV_WINDOW_AUTOSIZE);
//创建膨胀滑动条
createTrackbar("Element Size:","output Image dilate",&element_size,max_size,CallBack_Demo_dilate);
//创建腐蚀滑动条
createTrackbar("Element Size:","output Image erode",&element_size,max_size,CallBack_Demo_erode);
//调用膨胀回调函数
CallBack_Demo_dilate(0,NULL);
//调用腐蚀回调函数
CallBack_Demo_erode(0,NULL);
waitKey(0);
}
原图像:
膨胀图像:
腐蚀图像: