• OpenCV(6)-腐蚀和膨胀


    腐蚀和膨胀属于形态学操作。

    腐蚀和膨胀

    腐蚀是指:将卷积核B滑过图像A,找出卷积核区域内最小像素值作为锚点像素值。这一操作可以扩大低像素值区域。
    膨胀是指:将卷积核B滑过图像A,找出卷积核区域内最大像素值作为锚点像素值。这一操作可以缩小低像素值区域。

    通过前面的卷积可以看出,膨胀相当于“最大值”滤波器,腐蚀相当于”最小值“滤波器。滤波器的形状我们可以自己定义。

    其他形态学操作

    开运算

    先对图像腐蚀,再膨胀

    [ exttt{dst} = mathrm{open} ( exttt{src} , exttt{element} )= mathrm{dilate} ( mathrm{erode} ( exttt{src} , exttt{element} )) ]

    闭运算

    先膨胀再腐蚀

    [ exttt{dst} = mathrm{close} ( exttt{src} , exttt{element} )= mathrm{erode} ( mathrm{dilate} ( exttt{src} , exttt{element} )) ]

    形态梯度

    膨胀图和腐蚀图之差

    [ exttt{dst} = mathrm{morph\_grad} ( exttt{src} , exttt{element} )= mathrm{dilate} ( exttt{src} , exttt{element} )- mathrm{erode} ( exttt{src} , exttt{element} ) ]

    顶冒

    原图和开运算图之差

    [ exttt{dst} = mathrm{tophat} ( exttt{src} , exttt{element} )= exttt{src} - mathrm{open} ( exttt{src} , exttt{element} ) ]

    黑冒

    闭运算结果和原图之差

    [ exttt{dst} = mathrm{blackhat} ( exttt{src} , exttt{element} )= mathrm{close} ( exttt{src} , exttt{element} )- exttt{src} ]

    实验代码

    常用函数

    Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))
    

    获取卷积核,卷积核中,对应形状位置的元素都为1.
    shape:
    MORPH_RECT:矩形
    MORPH_ELLIPSE:椭圆
    MORPH_CROSS:十字形

    ksize:
    核大小

    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:结果图像
    op:操作MORPH_OPEN开运算,MORPH_CLOSE闭运算、MORPH_GRADIENT形态梯度、MORPH_TOPHAT钉帽、MORPH_BLACKHAT黑冒

    代码

    #include <iostream>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char* argv[]){
    	const char* path = "";
    	Mat img = imread(path);
    	if (!img.data){
    		cout << "Wrong Image" << endl;
    		return -1;
    	}
    
    	Mat kern = getStructuringElement(MORPH_RECT, Size(5, 5));
    
    	Mat erosion_img, dilate_img;
    	//腐蚀
    	erode(img, erosion_img, kern);
    	//膨胀
    	dilate(img, dilate_img, kern);
    
    	imshow("original image", img);
    	imshow("erosion image", erosion_img);
    	imshow("dilate image", dilate_img);
    
    
    	Mat open_mat, close_mat, gradient_mat, tophat_mat, blackhat_mat;
    	morphologyEx(img, open_mat, MORPH_OPEN, kern);
    	morphologyEx(img, close_mat, MORPH_CLOSE, kern);
    	morphologyEx(img, gradient_mat, MORPH_GRADIENT, kern);
    	morphologyEx(img, tophat_mat, MORPH_TOPHAT, kern);
    	morphologyEx(img, blackhat_mat, MORPH_BLACKHAT, kern);
    
    	imshow("Opening", open_mat);
    	imshow("Closing", close_mat);
    	imshow("Grandient", gradient_mat);
    	imshow("Tohat", tophat_mat);
    	imshow("Black", blackhat_mat);
    
    	cvWaitKey(0);
    	return 0;
    }
    
  • 相关阅读:
    用户验证之自定义身份验证
    再谈CLR:查看程序集的依赖关系
    关于私钥加密、公钥加密、签名在生活中的场景
    MOSS 2010服务器对象模型(Object Model)
    用户身份验证之Windows验证
    由object不能比较引发的问题
    再谈CLR: .NET 4.0新功能:Mscoree.dll + Mscoreei.dll=更少的Reboot (上)
    再谈CLR:事件定义
    WPF:如何为程序添加splashScreen?
    通过反射得到类型的所有成员
  • 原文地址:https://www.cnblogs.com/korbin/p/5625340.html
Copyright © 2020-2023  润新知