腐蚀:拿一个结构元素去滑动窗口,将窗口覆盖下图像的最小值当作结构元素中心点的像素值;
膨胀:拿一个结构元素去滑动窗口,将窗口覆盖下图像的最大值当作结构元素中心点的像素值;
提取内边缘:原图-腐蚀后的图;
提取外边缘:膨胀后的图-原图;
开操作:先腐蚀后膨胀;
闭操作:先膨胀后腐蚀;
顶帽变换:原图 - 开操作后的图;
黑帽变换:闭操作后的图-原图。
主函数:
#include<opencv2/opencv.hpp>
using namespace cv;
void CallBack(int, void*);
int element_size = 3;
Mat src, dst;
int main(int arc, char** argv)
{
src = imread("1.jpg");
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
namedWindow("output", CV_WINDOW_AUTOSIZE);
createTrackbar("Element Size", "output",&element_size,21,CallBack);//创建轨迹条
CallBack(0, 0); //调用回调函数
waitKey(0);
return 0;
}
定义结构元素:getStructuringElement(shape, Size ksize, Point(-1, -1));
参数解释:结构元素形状,结构元素尺寸,锚点。
创建轨迹条:
1、创建轨迹条:createTrackbar("Element Size", "output",&element_size,21,CallBack);
参数解释:轨迹条名称,窗口名称,起始值,终止值,回调函数。
2、调用回调函数 :CallBack(0, 0);
3、定义回调函数:CallBack(int, void*){}
【1】腐蚀:erode(src, dst, structure, Point(-1, -1));
参数解释:原图像,目标图像,结构元素,锚点
腐蚀回调函数:
void CallBack(int, void*) {
int s = 2 * element_size + 1;
Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
erode(src, dst, structure, Point(-1, -1));//腐蚀
imshow("output", dst);
}
运行结果如下:
【2】膨胀:dilate(src, dst, structure, Point(-1, -1));
参数解释:原图像,目标图像,结构元素,锚点
膨胀回调函数:
void CallBack(int, void*) {
int s = 2 * element_size + 1;
Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
dilate(src, dst, structure, Point(-1, -1));//膨胀
imshow("output", dst);
}
运行结果如下:
【3】形态学操作: morphologyEx(src, dst, int op, structure);
参数解释:原图形,目标图像,操作类型,结构元素;
操作类型有: MORPH_ERODE = 0(腐蚀)
MORPH_DILATE = 1(膨胀)
MORPH_OPEN = 2(开运算)
MORPH_CLOSE = 3(闭运算)
MORPH_GRADIENT = 4(梯度)
MORPH_TOPHAT = 5(顶帽)
MORPH_BLACKHAT = 6(黑帽)
MORPH_HITMISS = 7(击中击不中)
开运算回调函数:
void CallBack(int, void*) {
int s = 2 * element_size + 1;
Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
morphologyEx(src, dst, MORPH_OPEN, structure);
imshow("output", dst);
}
运行结果如下:
闭运算回调函数:
void CallBack(int, void*) {
int s = 2 * element_size + 1;
Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
morphologyEx(src, dst, MORPH_CLOSE, structure);
imshow("output", dst);
}
运行结果如下:
顶帽变换回调函数:
void CallBack(int, void*) {
int s = 2 * element_size + 1;
Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
morphologyEx(src, dst, MORPH_TOPHAT, structure);
imshow("output", dst);
}
运行结果图如下:
黑帽变换回调函数:
void CallBack(int, void*) {
int s = 2 * element_size + 1;
Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
morphologyEx(src, dst, MORPH_BLACKHAT, structure);
imshow("output", dst);
}
运行结果如下:
定义水平结构元素提取水平直线 :
#include<opencv2/opencv.hpp>
using namespace cv;
void CallBack(int, void*);
int element_size = 3;
Mat src, dst,gray, bin_gray;
int main(int arc, char** argv)
{
src = imread("5.jpg");
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
cvtColor(src, gray,CV_BGR2GRAY);
imshow("gray", gray);
adaptiveThreshold(~gray, bin_gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15,0);
imshow("bin_gray", bin_gray);
Mat structure = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
namedWindow("output", CV_WINDOW_AUTOSIZE);
createTrackbar("Element Size", "output",&element_size,21,CallBack);//创建轨迹条
CallBack(0, 0); //调用回调函数
waitKey(0);
return 0;
}
void CallBack(int, void*) {
int s = 2 * element_size + 1;
Mat structure = getStructuringElement(MORPH_RECT, Size(s,1), Point(-1, -1));
//erode(src, dst, structure, Point(-1, -1));//腐蚀
//dilate(src, dst, structure, Point(-1, -1));//膨胀
morphologyEx(bin_gray, dst, MORPH_OPEN, structure);//形态学操作
imshow("output", dst);
}
运行结果如下:
定义垂直结构提取竖直直线 :将上面结构元素改为Mat structure = getStructuringElement(MORPH_RECT, Size(1,s), Point(-1, -1))即可;
运行结果如下: