有关opencv的学习(16)—图像的膨胀和腐蚀(2)

形态学其他操作:

          开运算、闭运算、顶帽、黒帽、形态学梯度 

基于膨胀腐蚀基础, 利用morphologyEx()函数进行操作


核心函数为:

CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,

                                int op, InputArray kernel,

                                Point anchor=Point(-1,-1), int iterations=1,

                                int borderType=BORDER_CONSTANT,

                                const Scalar& borderValue=morphologyDefaultBorderValue() );

src: 输入原图像。

dst: 输出图像要求和src一样的尺寸和类型。

op: 表示形态学运算的类型, 可以取如下值:

enum { MORPH_ERODE=CV_MOP_ERODE, MORPH_DILATE=CV_MOP_DILATE,

       MORPH_OPEN=CV_MOP_OPEN, MORPH_CLOSE=CV_MOP_CLOSE,

       MORPH_GRADIENT=CV_MOP_GRADIENT, MORPH_TOPHAT=CV_MOP_TOPHAT,

       MORPH_BLACKHAT=CV_MOP_BLACKHAT, MORPH_HITMISS };

kernel: 形态学运算内核, 若为NULL, 表示使用参考点位于中心的3x3内核, 一般使用getStruecuringElement函数获得。

anchor: 锚的位置, 默认值Point(-1,-1), 表示位于中心。

interations: 迭代使用函数的次数, 默认为1。

borderType: 边界模式, 一般采用默认值。

borderValue: 边界值, 一般采用默认值。


一、开运算

        开运算是先腐蚀后膨胀的过程, 开运算可以用来消除小物体, 在纤细点处分离物体, 并在平滑较大物体边界的同时不明显的改变其面积。

     cv::morphologyEx(image, openedImage, cv::MORPH_OPEN, element);

代码如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


//加入椒盐噪声
void salt(Mat image, int n)
{
    int i,j;
    for (int k=0; k<n; k++)
    {
        // rand()是随机数生成器
        i= rand()%image.cols;
        j= rand()%image.rows;
        if (image.type() == CV_8UC1)
        { // 灰度图像
            image.at<uchar>(j,i)= 255;
        }
        else if (image.type() == CV_8UC3)
        { // 彩色图像
            image.at<cv::Vec3b>(j,i)[0]= 255;
            image.at<cv::Vec3b>(j,i)[1]= 255;
            image.at<cv::Vec3b>(j,i)[2]= 255;
        }
    }
}


int main( )
{
    Mat image=imread("/Users/zhangxiaoyu/Desktop/lena.jpg");
    if(image.empty())
    {
        cout<<"Error!cannot be read...../n";
        return -1;
    }
    
    salt(image, 5000);
    
    namedWindow("saltImage");
    imshow("saltImage", image);
    
    cv::Mat openedImage;
    cv::Mat element3(3,3,CV_8U,cv::Scalar(1));
    cv::Mat opened;
    cv::morphologyEx(image, openedImage, cv::MORPH_OPEN, element3);
    
    namedWindow("openedImage");
    imshow("openedImage", openedImage);
    waitKey(0);
    
}


如下图所示:




二、闭运算

         闭运算是先膨胀后腐蚀的过程, 闭运算可以用来消除小型黑洞(黑色区域)。

        cv::morphologyEx(image, closedImage, cv::MORPH_CLOSE, element);

程序结果如下:



三、形态学梯度

        形态学梯度是膨胀图与腐蚀图之差, 对二值图可以将团块(blob)边缘凸显出来, 可以用其来保留边缘轮廓。

如下图所示:


四、Top-Hat变换(顶帽运算)

        顶帽运算也被称为”礼帽”, 是闭运算结果和原图像做差的结果, 可以用来分离比邻近点亮一些的斑块。


五、Black Hat变换(黑帽变换)

       黑帽运算是原图像和开运算做差的结果, 可以用来分离比邻近点暗一些的斑块。





























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章