开运算:先腐蚀后膨胀,可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积。
闭运算:先膨胀后腐蚀,,可以用来排除小型黑洞(黑色区域)。
形态学梯度:膨胀图和腐蚀图之差,对二值图像进行这一操作,可以将团块(blob)的边缘突出出来,保留物体的边缘轮廓。
顶帽:原图像和开运算结果图之差,常用来分离比邻近点亮一些的斑块,在一幅图像具有大幅的背景而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
黑帽:闭运算结果图和原图像之差,突出了比原图像轮廓周围的区域更暗的区域,所以用来分离比邻近点暗一些的斑块,效果图有着非常完美的轮廓。
void morphologyEx(inputArray,outputArray,int op,inputArrayKernel,Point(-1,-1),int iterations=1,int borderType=BORDER_CONSTANT,const Scalar& borderValue=morphologyDefaultBorderValue());
*第一个参数,输入图像,图像深度应为CV_8U、16U、16S、32F、64F之一。
*第二个参数,输出图像。
*第三个参数,表示形态学运算的类型:
(1)MORPH_OPEN:开运算
(2)MORPH_CLOSE:闭运算
(3)MORPH_GRADIENT:形态学梯度
(4)MORPH_TOPHAT:顶帽
(5)MORPH_BLACKHAT:黑帽
(6)MORPH_ERODE:腐蚀
(7)MORPH_DILATE:膨胀
*第四个参数,形态学运算的内核,若为NULL,表示使用参考点位于中心的3x3核,一般使用函数getStructuringElement配合这个参数适用。
*第五个参数,锚点的位置,默认值(-1,-1),表示锚点位于中心。
*第六个参数,迭代使用函数的次数,默认值为1。
*第七个参数,用于推断外部像素的某种边界模式。
*第八个参数,一般不用管。
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

//全局变量声明********************************
Mat g_srcImage,g_dstImage;
int g_nTrackbarNumber=0;//0表示开运算,1表示闭运算,2表示形态学梯度,3表示顶帽,4表示黑帽
int g_nKernelSize=3;//核大小



//全局函数声明********************************
void on_TrackbarNumberChange(int,void *);//回调函数
void on_KernelSizeChange(int,void *);//回调函数
void Process();

int main()
{
   //载入原始图片
    g_srcImage=imread("/Users/new/Desktop/1.jpg");
    if(!g_srcImage.data){printf("读取srcImage错误~! \n");return false;}
    //显示原始图片
    namedWindow("image[origin]");
    imshow("image[origin]",g_srcImage);
    //各种形态学操作操作
    namedWindow("image[morphology]");
    createTrackbar("open/close/gradient/top_hat/black_hat: ", "image[morphology]", &g_nTrackbarNumber, 4,on_TrackbarNumberChange);
    createTrackbar("kernel size: ", "image[morphology]", &g_nKernelSize, 21,on_KernelSizeChange);
    on_TrackbarNumberChange(g_nTrackbarNumber, 0);
    on_KernelSizeChange(g_nKernelSize,0);
    waitKey();
    return 0;
}

void Process()
{
    Mat element=getStructuringElement(MORPH_RECT, Size(g_nKernelSize*2+1,g_nKernelSize*2+1),Point(g_nKernelSize,g_nKernelSize));
    switch(g_nTrackbarNumber)
    {
        case 0:
            morphologyEx(g_srcImage, g_dstImage, MORPH_OPEN, element);break;
        case 1:
            morphologyEx(g_srcImage, g_dstImage, MORPH_CLOSE, element);break;
        case 2:
            morphologyEx(g_srcImage, g_dstImage, MORPH_GRADIENT, element);break;
        case 3:
            morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT, element);break;
        case 4:
            morphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element);break;
        default:
            CV_Error(CV_StsBadArg, "unknown morphological operation");

    }

    imshow("image[morphology]",g_dstImage);
}
//回调函数
void on_TrackbarNumberChange(int,void *)
{
    Process();
}

void on_KernelSizeChange(int,void *)
{
    Process();
}

原始图片:

java opencv 闭运算 opencv开运算和闭运算_#include

开运算:

java opencv 闭运算 opencv开运算和闭运算_java opencv 闭运算_02

闭运算:

java opencv 闭运算 opencv开运算和闭运算_黑帽_03

形态学梯度:

java opencv 闭运算 opencv开运算和闭运算_opencv_04

顶帽:

java opencv 闭运算 opencv开运算和闭运算_java opencv 闭运算_05

黑帽:

java opencv 闭运算 opencv开运算和闭运算_java opencv 闭运算_06