图像开运算、闭运算、形态学梯度、“礼帽”和“黑帽”

一、概念
图像的腐蚀和膨胀可以做更多的事情,可以通过膨胀和腐蚀来做一些图像的高级形态学变化,图像的高级形态学变化 有图像的开运算、闭运算、形态学梯度、顶帽,黑帽。

二、图像高级形态学变化
1、开运算:先腐蚀后膨胀

开运算可以用来消除小物体,在纤细点分离物体,平滑较大物体的边界的同时不明显的改变其面积。

2、闭运算:先膨胀后腐蚀

闭运算可以排除小的黑色区域。

3、形态学梯度:膨胀与腐蚀图之差

我们可以用形态学梯度来突出边缘,可以保留物体的边缘轮廓。

4、顶帽(Top Hat):原图与开运算结果图之差

开运算放大了裂缝或者局部低亮度的区域,所以,从原图中减去开运算后的图,得到的结果突出了比原图轮廓周围的区域更明亮的区域,这个操作与选择的核的大小有关。TopHat运算一般用来分离比邻近点亮一些的斑块,可以使用这个运算提取背景。

5、黑帽运算(Black Hat):闭运算的结果与原图之差

黑帽运算的结果突出了比原图轮廓周围区域更暗的区域,所以黑帽运算用来分离比邻近点暗一些的斑块。

三、实战

1、morphology函数

 void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue() );

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
oMORPH_OPEN – 开运算(Opening operation)
oMORPH_CLOSE – 闭运算(Closing operation)
oMORPH_GRADIENT -形态学梯度(Morphological gradient)
oMORPH_TOPHAT - “顶帽”(“Top hat”)
oMORPH_BLACKHAT - “黑帽”(“Black hat“)
另有CV版本的标识符也可选择,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT,这应该是OpenCV1.0系列版本遗留下来的标识符,和上面的“MORPH_OPEN”一样的效果。
 
第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getStructuringElement我们上篇文章中讲过了,这里为了大家参阅方便,再写一遍:
其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:
o矩形: MORPH_RECT
o交叉形: MORPH_CROSS
o椭圆形: MORPH_ELLIPSE

2、函数运用示例

void usage_high_level_erode_dilate(char* which)
{
    Mat   image = imread("./smimage/1.jpg");
    Mat   ele = getStructuringElement(MORPH_RECT, Size(5, 5));
    Mat   res;
    //which
    //open close gradient tophat blackhat
    //o c g t b
    switch (which[0]){
    case 'o':
        morphologyEx(image, res, MORPH_OPEN, ele);
        break;
    case 'c':
        morphologyEx(image, res, MORPH_CLOSE, ele);
        break;
    case 'g':
        morphologyEx(image, res, MORPH_GRADIENT, ele);
        break;
    case 't':
        morphologyEx(image, res, MORPH_TOPHAT, ele);
        break;
    case 'b':
        morphologyEx(image, res, MORPH_BLACKHAT, ele);
        break;
    }
    //show the image
    imshow("SRC", image);
    imshow(which, res);
    waitKey(0);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章