1、图像的形态学操作
包括膨胀、腐蚀、开运算、闭运算、顶帽操作、黑帽操作、形态学梯度等方法。
(1)膨胀
- 图像的膨胀应用:消除噪声、元素分隔和连接等。基于膨胀和腐蚀可以定位强度峰值或孔洞、是另一种形式的图像梯度。
- 膨胀是一种卷积操作,类似之前介绍的掩膜操作。它将目标像素(锚点)的值替换为卷积核覆盖区域的局部最大值。
void cv::dilate(cv::InputArray src, cv::OutputArray dst,cv::InputArray element,cv::Point anchor,int iterations,int borderType)
//sec:输入图像;dst:输出图像;element:卷积核结构,类型为Mat
//anchor:类型为Point,表示卷积核锚点位置,默认为Point(-1,-1)即
//卷积核中心点作为锚点(目标像素点);interations:应用次数,默
//认为执行1次;borderTyoe:图像经过形态学运算后,图像边界的处
//理方式,默认BORDER_CONSTANT 复制指定的常量扩展边界,更多请
//查看Opencv边框类型,或者CV::copyMakeBorder()函数。
(2)腐蚀
- 腐蚀是一种卷积操作,类似之前介绍的掩膜操作。于膨胀相反,它将目标像素(锚点)的值替换为卷积核覆盖区域的局部最小值。
void cv::erode(cv::InputArray src, cv::OutputArray dst,cv::InputArray element,cv::Point anchor,int iterations,int borderType)
//sec:输入图像;dst:输出图像;element:卷积核结构,类型为Mat
//anchor:类型为Point,表示卷积核锚点位置,默认为Point(-1,-1)即
//卷积核中心点作为锚点(目标像素点);interations:应用次数,默
//认为执行1次;borderTyoe:图像经过形态学运算后,图像边界的处
//理方式,默认BORDER_CONSTANT 复制指定的常量扩展边界,更多请
//查看Opencv边框类型,或者CV::copyMakeBorder()函数。
- 总结:形态学操作既可以对阈值化后的二值图像进行操作,也可以对有强度的图像进行操作。膨胀扩张了明亮区域,腐蚀缩减了明亮区域。膨胀填充凹面,腐蚀消除凸起。当然,具体效果还和核有关。
(3)自定义核(结构元素)
自己定义形态学核。注意:结构元素应为奇数。
cv::getStucutingElement(int shape,cv::Size ksize,cv::Point anchor)
//shape:核形状值,常见MORPH_RECT(矩形),MORPH_ELLIPSE(椭圆
//形),MORPH_CROSS(交叉),具体请查阅手册
椭圆形核
矩形核
交叉形核
2、TrackBar控件使用
创建一个GUI控件,用于调整变量大小,对程序进行测试。
trackbarname:给定TrackBar的名称;winName:TrackBar显示的窗口名称;*value:TrackBar要调整的变量,因为其为指针类型,则此处应填写变量的地址(取地址);count:TrackBar能够调整的最大值;func:TrackBar调整时,反复调用的函数;
//TrackBar调用的函数示例
void TrackBarCallbackdemo(int,void*)
{
//函数体;
}
程序:
#include <opencv2/opencv.hpp>
#include <iostream>
void callbackdemo(int, void*);//声明callback函数
using namespace cv;
using namespace std;
Mat src, dst;
int element = 3;
char outputname[] = "Output window";
int main(int argc, char ** argv)
{
char inputname[] = "inout picture";
src = imread("C:/Users/Mr_Cheng/Desktop/test/yang.jpg");
namedWindow(inputname, CV_WINDOW_AUTOSIZE);
imshow(inputname, src);
namedWindow(outputname, CV_WINDOW_AUTOSIZE);
//创建Trackbar控件
createTrackbar("Struct element", outputname, &element, 21,callbackdemo);
//调用一次callback函数,此函数为创建的Trackbar函数回调函数,
callbackdemo(0, 0);
waitKey(0);
return 0;
}
//callback函数的功能
void callbackdemo(int, void*)
{
int sz = element *2 + 1;
//创建核,矩形核
Mat structElement = getStructuringElement(MORPH_RECT, Size(sz, sz));
//腐蚀
erode(src, dst, structElement, Point(-1, -1));
//膨胀
//dilate(src, dst, structElement);
//通用形态学函数
//morphologyEx(src, dst,CV_MOP_CROSS, structElement, Point(-1, -1));
imshow(outputname, dst);
}
运行效果