【Opencv 学习(五)】图像形态学操作及创建TrackBar控件调试

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);
}

运行效果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值