Opencv基础入门笔记09:图片腐蚀与膨胀
1.图片腐蚀与膨胀的概念、原理
首先讲一下图片的形态学操作是什么:如图
我们可以看到,图片的形态学操作的作用有:
1.可以有效去除噪声
2.保留图片的特征信息
3.增强特征信息
4.有利于边缘信息的提取
图片形态学一般的操作包括:腐蚀、膨胀、开、闭运算4种,其中,常用的就是膨胀与腐蚀
原理:用具有特定形状的结构元素(Structure Elenment),去对二值化的图像进行卷积的逻辑运算,达到度量、过滤、提取图片某一特征的形状。运算结果是对结构元素对应下的每个像素进行相同运算,输出对应的每个像素值注意!!!!!卷积运算种定义的结构元素的Size必须为奇数
详细:
膨胀:此操作将图像 A 与任意形状的内核 (B),即结构元素,通常为正方形或圆形,进行卷积。
内核 B 有一个可定义的 锚点(anchor), 通常定义为内核中心点。
进行膨胀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。
dilation result - Theory example(膨胀的一般效果)
背景(白色)膨胀,而轮廓变小了。
腐蚀
腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。
进行腐蚀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最小相素值提取,并代替锚点位置的相素。
erode result - Theory example
背景(白色)变细,而轮廓则变大了。
注意这里的结构元素实际的Size=2(滑动条数字)+1;结构元素得保证是奇数
2.图片形态学一般步骤
1.读取图片并二值化图片(二值化为了提取某特征及减少运算量)
2.定义结构元素大小(奇数)
3.创建窗口,调用膨胀腐蚀两个API(dilation,erode)//必要可以创建滑动条
4.显示图片或者进行图像模糊处理,边缘检测等步骤、
3.API介绍及代码演示
1.API介绍
dilation(src,dst,kernel)//1.输入的图片;2.要输出的目标图片;3.结构元素
erode(src,dst,kernel)//1.输入的图片;2.要输出的目标图片;3.结构元素
2.代码演示
// Opencv 文件.cpp :
#include "pch.h"
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int elenment_size = 3;
int max_size = 21;
void Callback_demo(int, void*);
Mat dst;
Mat src1;
char OUTPUT_WIN[] = "output_image";
int main()
{
src1 = imread("E:\\360downloads\\wpcache\\1.jpg");
if (!src1.data) {//!src.data与src.empty()一样;
printf("failure to load the image1 ");
return -1;
}
namedWindow(OUTPUT_WIN, WINDOW_AUTOSIZE);
imshow("src1", src1);
createTrackbar("elenment_size", OUTPUT_WIN, &elenment_size, max_size,Callback_demo);
Callback_demo(0, 0);
waitKey(0);
return 0;
}
void Callback_demo(int, void*) {
int s = elenment_size*2+1;
//定义一个卷积核,kernel 的shape;
Mat kernel = getStructuringElement(MORPH_CROSS, Size(s, s), Point(-1, -1));
//进行形态学操作之膨胀
// dilate(src1, dst, kernel);//看起来就是轮廓变小,颜色膨胀;
erode(src1, dst, kernel);//看起来就是轮廓变小,颜色被腐蚀了一样;
imshow(OUTPUT_WIN, dst);
return;
}
腐蚀的效果图,Structure Elenment Size(2*18+1);
膨胀的效果图,Structure Elenment Size(2*18+1);
end!