【opencv图像处理中的形态学操作】
腐蚀膨胀都是用一个卷积核对图像进行卷积处理,并取出结果中的极大/小值作为结果,腐蚀是图片中黑的区域增加,膨胀是图片中高亮区域增加(消除这些小的黑斑)。
API:Mat getStructuringElement(int 内核形状,Size 内核尺寸,Point 锚点位置)
注:内核形状可以取方形MORPH_RECT,十字形MORPH_CROSS,椭圆形MORPH_ELLIPSE
锚点位置默认值Point(-1,-1),取形状的中心
通过该API就可以获得相应的计算核,接下来计算膨胀的函数为
API:void dilate(源图像,目标图像,膨胀核,锚点,int 迭代次数,int边界模式,int 边界为常数时边界值)
开运算与闭运算的结合经常用于二值图像的后处理阶段,整个过程消除了二值图像中的孤立目标,并且填补了目标区域的内部孔洞。但是这两种运算会破坏目标原本轮廓和形状,特别是对于小尺寸目标会变得十分明显。
开运算:开运算是一个先腐蚀,后膨胀的过程,用于在图像中消除小的物体,在纤细点处分离物体,在平滑化较大的物体的边界的同时不明显改变物体的体积.
闭运算:先膨胀后腐蚀的过程,能够用于消除物体中的小型黑洞
API:void morpholgyEx(源,目标,int 形态学操作标志,mat 形态学操作内核,Point 锚点,int 迭代次数,int 边界模式,int 边界为常数时的边界值).
注:形态学操作标志的取值如下:MORPH_OPEN开运算 MORPH_CLOSE 闭运算 MORPH_GRENIENT 形态学梯度 MORPH_TOPHAT顶帽 MORPH_BLACKHAT黑帽 MORPH_ERODE腐蚀 MORPH_DILATE 膨胀
形态学操作内核就是前面膨胀腐蚀使用的内核
使用滑动条迭代一次进行处理:
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
Mat srcImage;
//开
const int g_openCoreMax = 100;
int g_nopenCoreValue=5;
void onopenCoreSizeTrackBar(int , void* );
//闭
const int g_closeCoreMax = 100;
int g_ncloseCoreValue=5;
void oncloseCoreSizeTrackBar(int, void* );
int main(int argc, char* argv[])
{
srcImage = imread("123.jpg");
namedWindow("src image", WINDOW_AUTOSIZE);
namedWindow("open image", WINDOW_AUTOSIZE);
createTrackbar("core size", "open image", &g_nopenCoreValue, g_openCoreMax, onopenCoreSizeTrackBar, 0);
onopenCoreSizeTrackBar(0, 0);
namedWindow("close image", WINDOW_AUTOSIZE);
createTrackbar("core size", "close image", &g_ncloseCoreValue, g_closeCoreMax, oncloseCoreSizeTrackBar, 0);
oncloseCoreSizeTrackBar(0, 0);
imshow("src image", srcImage);
waitKey(0);
return 0;
}
void onopenCoreSizeTrackBar(int , void* )
{
Mat openImage;
if (g_nopenCoreValue == 0 )
{
imshow("open image", srcImage);
}
else
{
if (g_nopenCoreValue % 2 == 0)
g_nopenCoreValue++;
Mat core = getStructuringElement(MORPH_RECT, Size(g_nopenCoreValue, g_nopenCoreValue));
morphologyEx(srcImage, openImage, MORPH_OPEN, core, Point(-1, -1), 1);
imshow("open image", openImage);
}
}
void oncloseCoreSizeTrackBar(int, void*)
{
Mat closeImage;
if (g_ncloseCoreValue == 0)
{
imshow("close image", srcImage);
}
else
{
if (g_ncloseCoreValue % 2 == 0)
g_ncloseCoreValue++;
Mat core = getStructuringElement(MORPH_RECT, Size(g_ncloseCoreValue, g_ncloseCoreValue));
morphologyEx(srcImage, closeImage, MORPH_CLOSE, core, Point(-1, -1),1);
imshow("close image", closeImage);
}
}
运行输出: