形态学有四个基本操作:腐蚀、膨胀、开、闭。
腐蚀与膨胀
#include <opencv2/opencv.hpp>//引入头文件
#include <iostream>//内存io
#include <math.h>//计算库
#include<opencv2/highgui/highgui_c.h>
using namespace cv;//命名空间 不用每个函数都加cv::了
Mat src,dst;//矩阵化源图像和目标图像,主要用于指针像素的前缀
char OUTPUT_WIN[] = "output image";
int element_size = 3;
int max_size = 21;//规定滑条的数据从3-21
void CallBack_Demo(int, void*);//滑条中呼应起的膨胀或腐蚀函数
int main(int argc, char** argv){
src = imread("D:\\桌面\\code\\opencvlearn\\配套代码\\课程配套代码与图片5\\代码与图片\\cvtest.png");//提取
if (!src.data) {
printf("could not find image...\n");//无图片产出
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
namedWindow("OUTPUT_WIN", WINDOW_AUTOSIZE);
createTrackbar("Element Size:",OUTPUT_WIN, &element_size, max_size, CallBack_Demo);//要用7-20的这种窗口创建模式才能够使用(“滑条名称”,窗口名,&最小元素,最大元素,函数)
CallBack_Demo(0, 0);//调用函数
waitKey(0);//按任意键退出
return 0;
}
void CallBack_Demo(int, void*) {
int s = element_size * 2 + 1;//结构元素B中的Size()大小为 2n+1
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));//结构元素矩阵(形状,大小,Point(-1,-1)默认为中心点
dilate(src, dst, structureElement,Point(-1,-1),1);//膨胀(源,目标,掩膜/结构元素) 腐蚀erode(src,dst,kernel)
imshow("OUTPUT_WIN", dst);//注意7-20-31行这个窗口的处理分成了三句分散在代码之中
}
如图本代码遇到了此问题目前未解决。参考:
R6010 -abort() has been called错误分析及其解决方法_奈何小洪的博客-CSDN博客_abort()has been calledhttps://blog.csdn.net/qingzai_/article/details/44244595
将图像的膨胀和腐蚀相结合产生了如下的功效
开、闭、梯度、顶帽、黑帽
这里是形态学操作的总API
开操作
代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/highgui/highgui_c.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/桌面/code/opencvlearn/配套代码/课程配套代码与图片5/代码与图片/pill_002.png");
if (!src.data) {
printf("could not load image...\n");
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
namedWindow("morphology demo", CV_WINDOW_AUTOSIZE);
Mat kernel = getStructuringElement(MORPH_RECT, Size(11,11), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_OPEN, kernel);
imshow("morphology demo", dst);
waitKey(0);
return 0;
}
闭操作
代码方面只需要将CV_MOP_OPEN置换为CV_MOP_CLOSE即可
形态学梯度
图像腐蚀后图像整体就会缩小,而膨胀就会扩大,用膨胀后的图像减去源图像或腐蚀后的图像,或者用源图像减去腐蚀后的图像,都会去除图像前景色中间的部分得到一个图像的轮廓,这些减法运算就是形态学梯度运算。
原图像膨胀后的图像和腐蚀后图像间的差值图像叫做形态学基本梯度。
膨胀后的图像和原图像间的差值图像叫做形态学外部梯度。
原图像和腐蚀后图像间的差值图像叫做形态学内部梯度。
当kernel核矩阵为全1的行向量时,得到的梯度图称为X方向的梯度图;
当kernel核矩阵为全1的列向量时,得到的梯度图称为Y方向的梯度图。
————————————————
版权声明:本文为CSDN博主「昊虹图像算法」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wenhao_ir/article/details/12481276
置换为CV_MOP_GRADIENT即可
效果如下:
顶帽
置换为CV_MOP_TOPHAT即可,代码效果如下图所示:
黑帽
置换为CV_MOP_BLACKHAT即可,其效果如下图所示: