图像处理
形态学有四个基本操作:腐蚀、膨胀、开、闭。
opencv笔记(十七)——形态学操作(膨胀、腐蚀、开、闭操作)_马大哈先生的博客-CSDN博客一、设置结构元素:getStructuringElement 图像处理经常要用到形态学操作,其中首先要获取结构元素。包括结构元素的大小及形状。 OpenCV提供了一个函数getStructuringElement,可以获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。 C++:Mat getStructuringElement(int shape, Size...
十九、图像的形态学操作_beyond谚语的博客-CSDN博客_图像形态学一、图像形态学图像形态学是图像处理学科的一个单独分支学科主要针对的是灰度图和二值图像是由数学的集合论以及数学中的拓扑几何原理发展而来二、膨胀操作(dilate)3×3的卷积核以3×3为卷积核从左往右(从上往下)开始运行,若这卷积核内存在1,则用1替代中心元素。最大值取代中心像素白变多,黑变少膨胀的作用:对象大小增加一个像素(3×3)平滑对象边缘减少或者填充对象之间的距离二值图import cv2 as cvimport numpy as npdef dilate(i=1001.2101.3001.6650.10&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-10-123976473-blog-80001590.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-10-123976473-blog-80001590.pc_relevant_aa&utm_relevant_index=11
腐蚀与膨胀
#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+1Mat 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 called
将图像的膨胀和腐蚀相结合产生了如下的功效
开、闭、梯度、顶帽、黑帽
这里是形态学操作的总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版权协议,转载请附上原文出处链接及本声明。
原文链接:
置换为CV_MOP_GRADIENT即可
效果如下:
顶帽
置换为CV_MOP_TOPHAT即可,代码效果如下图所示:
黑帽
置换为CV_MOP_BLACKHAT即可,其效果如下图所示: