OpenCV图片背景色为黑色
腐蚀的作用是消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点;
膨胀的作用是将与物体接触的所有背景点合并到物体中,使目标增大,可添补目标中的空洞。
开运算是先腐蚀后膨胀的过程,可以消除图像上细小的噪声,并平滑物体边界。
闭运算时先膨胀后腐蚀的过程,可以填充物体内细小的空洞,并平滑物体边界。
简单来说,腐蚀会放大黑色区域使图片变黑,膨胀会缩小黑色区域使图片变白。
具体原理就不提了,这是入门教程不是上课,反正我看见那些东西就头疼,以实践为主。
原图
腐蚀
腐蚀函数为:
void
参数为(输入,输出,处理核等等)
实验一下
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
//载入原图
Mat srcImage = imread("1.jpg");
//显示原图
imshow("Original", srcImage);
//进行腐蚀操作
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat dstImage;
erode(srcImage, dstImage, element);
//显示效果图
imshow("Result", dstImage);
waitKey(0);
return 0;
}
腐蚀结果:
膨胀
膨胀函数为:
void cv::dilate ( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue=orphologyDefaultBorderValue()
)
参数为(输入,输出,处理核等等)
实验一下
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
//载入原图
Mat image = imread("../data/images/1.jpg");
//显示原图
imshow("Original Image", image);
//进行膨胀操作
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
dilate(image, out, element);
//显示效果图
imshow("Result", out);
waitKey(0);//如果没有,界面会立刻退出
return 0;
}
结果如下:
动态显示
动态显示结果需要滑动栏,滑动栏介绍见
OpenCV系列3:界面滑动栏mp.weixin.qq.com使用滑动栏来控制腐蚀膨胀动态参数设置
动态代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
// 描述:全局变量声明
Mat g_srcImage, g_dstImage;//原始图和效果图
int g_nTrackbarNumer = 0;//0表示腐蚀erode, 1表示膨胀dilate
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸
// 描述:全局函数声明
void Process();//膨胀和腐蚀的处理函数
void on_TrackbarNumChange(int, void *);//回调函数
void on_ElementSizeChange(int, void *);//回调函数
int main( )
{
//载入原图
g_srcImage = imread("../data/images/1.jpg");
if( !g_srcImage.data ) { printf("读取srcImage错误~! n"); return false; }
//显示原始图
imshow("Original", g_srcImage);
//进行初次腐蚀操作并显示效果图
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));
erode(g_srcImage, g_dstImage, element);
imshow("Result", g_dstImage);
//创建轨迹条
createTrackbar("腐蚀/膨胀", "Result", &g_nTrackbarNumer, 1, on_TrackbarNumChange);
createTrackbar("内核尺寸", "Result", &g_nStructElementSize, 21, on_ElementSizeChange);
//输出一些帮助信息
cout<<endl<<"t运行成功,请调整滚动条观察图像效果~nn"
<<"t按下“q”键时,程序退出。n";
//轮询获取按键信息,若下q键,程序退出
while(char(waitKey(1)) != 'q') {}
return 0;
}
// 描述:进行自定义的腐蚀和膨胀操作
void Process()
{
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));
//进行腐蚀或膨胀操作
if(g_nTrackbarNumer == 0) {
erode(g_srcImage, g_dstImage, element);
}
else {
dilate(g_srcImage, g_dstImage, element);
}
//显示效果图
imshow("Result", g_dstImage);
}
// 描述:腐蚀和膨胀之间切换开关的回调函数
void on_TrackbarNumChange(int, void *)
{
//腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来
Process();
}
// 描述:腐蚀和膨胀操作内核改变时的回调函数
void on_ElementSizeChange(int, void *)
{
//内核尺寸已改变,回调函数体内需调用一次Process函数,使改变后的效果立即生效并显示出来
Process();
}
代码没什么难点,就是函数整合。需要了解前面所说的回调函数。当然了C++不会的话我也没办法。
效果如下:
腐蚀膨胀动态操作_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com说明
1、腐蚀膨胀操作需要的核获取腐蚀固定,调用函数获取就行了。
2、鉴于网上OpenCV系统资料太多且杂乱,B站的视频使用的版本又太老了,本系列教程出现的原因就是为了该进一些资料老旧不兼容的问题。本系列会给最终的系列教程视频提供经验,所以有什么问题、建议、意见、改进尽管提。什么姿势我都会。
3、代码在github中。