图像形态学
形态学源于动物学与生物学。图像形态学主要研究图像的形态特征,实际表现为图像像素之间的关系。
图像像素与邻域像素进行特定的逻辑操作,操作的结果即为形态特征。
形态学图像处理的基本运算有4个:膨胀、腐蚀、开操作和闭操作
形态学的主要应用:边界提取、区域填充、连通分量的提取、凸壳、细化、粗化等
链接:图像形态学
本文头文件以及使用的命名空间
#pragma once
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
获取结构元素(getStructuringElement())
在进行图像形态学操作前,需要获取图像结构元素。它类似于卷积与滤波中对图像操作的卷积核,opencv中使用getStructuringElement()获取特定形状与大小的结构元素,在被用于后续的形态学操作中。
shape :结构元素的形状,MORPH_RECT矩形 MORPH_CROSS十字形 MORPH_ELLIPSE椭圆
ksize : 结构元素的大小
anchor :结构元素的锚点,默认为中心点
膨胀(dilate())
src : 输入图像
dst : 输出图像
kernel : 结构元素,由getstructelement获得
anchor : 结构元素的锚点,默认中心
iteration : 膨胀的次数
测试代码:这里使用morphologyEx函数,内部也是调用dilate函数
//膨胀
Mat m1 = imread(path8, 1);
Mat m2;
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
morphologyEx(m1, m2, MORPH_DILATE, kernel);
namedWindow("truth image", WINDOW_AUTOSIZE);
namedWindow("dilate image", WINDOW_AUTOSIZE);
imshow("truth image", m1);
imshow("dilate image", m2);
waitKey(0);
运行结果:
腐蚀(erode())
参数与dilate一致
测试代码:
运行结果
膨胀与腐蚀也可以使用morphologyEx()函数中对应的操作,本质相同,morphologyEx()内部也是调用dilate和erode函数。
膨胀与腐蚀都相对于白色像素(255)而言,膨胀扩大白色区域,腐蚀缩小白色区域。两者不是互逆关系,由接下来的闭与开操作可知,膨胀与腐蚀的顺序会产生不同的结果。
闭
闭操作,先膨胀在腐蚀,用于消除白色区域中的黑色的空洞。
图像形态学操作均可使用morphologyEx函数,选择不同的操作完成。
src : 输入图像
dst : 输出图像
op : 选择的形态学操作
kernel : 结构元素
anchor : 结构元素的锚点
iterations : 执行形态学操作的次数
测试代码:
//闭操作
Mat m5 = imread(path6, 1);
Mat m6;
//获取结构元素 矩形 尺寸为7 中心锚点
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7),Point(-1, -1));
//形态学闭操作
morphologyEx(m5, m6, MORPH_CLOSE , kernel);
namedWindow("truth image", WINDOW_AUTOSIZE);
namedWindow("close image", WINDOW_AUTOSIZE);
imshow("truth image", m5);
imshow("close image", m6);
waitKey(0);
运行结果:
结构元素的Size越大,就可以消去更大的黑洞。
形态学操作
选择MORPH_CLOSE即为闭操作。
开
开操作,先腐蚀,在膨胀,用于消除黑色区域中的白点。选择MORPH_OPEN即为开操作。
测试代码:
运行结果:
//开操作
Mat m7 = imread(path7, 1);
Mat m8;
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
morphologyEx(m7, m8, MORPH_OPEN, kernel);
namedWindow("truth image", WINDOW_AUTOSIZE);
namedWindow("open image", WINDOW_AUTOSIZE);
imshow("truth image", m7);
imshow("open image", m8);
waitKey(0);
顶帽
原始图像减去开运算(先腐蚀在膨胀)。用于获取图像中的噪声
测试代码:
//顶帽
Mat m7 = imread(path7, 1);
Mat m8;
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
morphologyEx(m7, m8, MORPH_TOPHAT, kernel);
namedWindow("truth image", WINDOW_AUTOSIZE);
namedWindow("top hat image", WINDOW_AUTOSIZE);
imshow("truth image", m7);
imshow("top hat image", m8);
waitKey(0);
运行结果:
黑帽
闭运算(先膨胀在腐蚀)减去原始图像。用于获取图像中的白色区域的黑点,并转为白色。
测试代码:
//黑帽
Mat m5 = imread(path6, 1);
Mat m6;
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7),Point(-1, -1));
morphologyEx(m5, m6, MORPH_BLACKHAT , kernel);
namedWindow("truth image", WINDOW_AUTOSIZE);
namedWindow("black hat image", WINDOW_AUTOSIZE);
imshow("truth image", m5);
imshow("black hat image", m6);
waitKey(0);
运行结果:
参考链接: 图像顶帽与黑帽.
文章内容有误或可改正地方,可私信,会即使修改。