图像的膨胀与腐蚀
1、图像的膨胀
跟卷积操作类似,如有图像A, 结构元B, 结构元B在A上面移动,其中定义B的中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,B可以是任意的形状。
原图:
膨胀后的图:
示例图像中,原图白色较多(255,255,255), 黑色(0,0,0)区域较少,根据膨胀原理,将结构元B对应A的区域中最大的值赋值给锚点,即将(255,255,255)像素值赋值给锚点,即膨胀后白色的区域增加,黑色的区域减少。
膨胀操作所需api:
getStructuringElement(int shape, Size ksize, Point anchor)
int shape: MORPH_RECT/MORPH_CROSS/MORPH_ELLIPSE
ksize: 核的大小
anchor: Point(-1,-1)默认中点即为锚点。
//膨胀
dilate(src, dst, kernel)
2、腐蚀
腐蚀前:
腐蚀后:
腐蚀:以最小值替换重叠图像下锚点的像素。
腐蚀前白色(255,255,255)区域偏多,进行腐蚀操作,即将最小值赋值给锚点像素,最小值黑色(0,0,0)赋值给锚点,即黑色区域增大。
腐蚀api:
erode(src, dst, kernel);
3、可视化拉伸条
拉伸条api:
createTrackbar(const string &trackername, const string winname, int* value, int count, TrackbarCallback);
4、代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat img, dst1, dst2;
char output[] = "output";
int element = 3;
int max_size = 10; //最大调节量
void CallbackFunc(int, void*);
int main(int argc, char** argv)
{
img = imread("G:/testpic/img.png");
if (img.empty())
{
printf("cannot load the image");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", img);
//拉伸条
namedWindow(output, WINDOW_AUTOSIZE);
createTrackbar("Element:", output, &element, max_size, CallbackFunc);
CallbackFunc(0,0);
waitKey(0);
return 0;
}
void CallbackFunc(int, void*)
{
//结构元
int k = element * 2 + 1;
Mat structElement = getStructuringElement(MORPH_RECT, Size(k,k), Point(-1,-1));
//二选一
//膨胀
dilate(img, dst1, structElement, Point(-1,-1), 1);
imshow(output, dst1);
return;
//腐蚀
erode(img, dst2, structELement);
imshow(output, dst2);
return;
}
原图:
膨胀:
腐蚀后: