侵蚀图像

侵蚀是图像处理中的基本形态学操作。顾名思义,此操作会侵蚀图像中前景像素的边界。在执行该腐蚀操作之后,图像中的对象变小,而对象中的孔(如果有)会变大。
在该技术中,将所得图像的每个像素值计算为由内核定义的像素邻域的最小值。对于彩色图像,每个彩色平面都是独立处理的。

3 x 3内核用于腐蚀操作


用于腐蚀操作的3x3核心
下图显示了如何使用上述3 x 3内核腐蚀图像。同样,你也可以用5 x 5、7 x 7等内核侵蚀图像。


使用OpenCV侵蚀图像

OpenCV具有内置功能,可侵蚀指定内核大小的图像。这个简单的程序演示了如何使用OpenCV以3 x 3和5 x 5核心侵蚀图像。
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    // 读取图像
    Mat image = imread("Lotus.jpeg");

    // 检测失败
    if (image.empty())
    {
        cout << "Could not open or find the image" << endl;
        cin.get(); //等待键盘
        return -1;
    }

    //使用3x3核心侵蚀图像
    Mat image_eroded_with_3x3_kernel;
    erode(image, image_eroded_with_3x3_kernel, getStructuringElement(MORPH_RECT, Size(3, 3)));

    //使用5x5核心侵蚀图像
    Mat image_eroded_with_5x5_kernel;
    erode(image, image_eroded_with_5x5_kernel, getStructuringElement(MORPH_RECT, Size(5, 5)));

    //创建窗口
    namedWindow("原图");
    namedWindow("3x3核心侵蚀图像");
    namedWindow("5x5核心侵蚀图像");

    // 显示图像
    imshow("原图", image);
    imshow("3x3核心侵蚀图像", image_eroded_with_3x3_kernel);
    imshow("5x5核心侵蚀图像", image_eroded_with_5x5_kernel);

    waitKey(0); // 等待键盘

    destroyAllWindows(); //毁灭窗口

    return 0;
}
复制粘贴以上代码,注意把以上的"Lotus.jpeg"换成有效的图像路径。编译运行后,效果如下:

原图

使用3x3核心侵蚀图像

使用5x5核心侵蚀图像


解说

Mat image_eroded_with_3x3_kernel;
erode(image, image_eroded_with_3x3_kernel, getStructuringElement(MORPH_RECT, Size(3, 3)));
erode()函数使用指定的内核腐蚀图像,该内核确定在其上拍摄最小值的像素的邻域。getStructuringElement(MORPH_RECT,Size(3,3))函数用于获取此形态运算的大小为3 x 3的矩形核。结果图像存储在image_eroded_with_3x3_kernel中。如果图像包含一个以上的通道(彩色图像具有3个或4个通道),则每个通道都会独立处理。
Mat image_eroded_with_5x5_kernel;
erode(image, image_eroded_with_5x5_kernel, getStructuringElement(MORPH_RECT, Size(5, 5)));
erode()函数使用指定的内核腐蚀图像,该内核确定在其上拍摄最小值的像素的邻域。getStructuringElement(MORPH_RECT,Size(5,5))函数用于获取此形态运算的大小为5 x 5的矩形核。结果图像存储在image_eroded_with_5x5_kernel中。如果图像包含一个以上的通道(彩色图像具有3个或4个通道),则每个通道都会独立处理。
void cv::erode(InputArray src, OutputArray dst, InputArray kernel, ] Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar & borderValue = morphologyDefaultBorderValue())	
			
通过使用特定的结构元素腐蚀图像。
该函数使用指定的结构化元素腐蚀源图像,该结构化元素确定在其上获取最小值的像素邻域的形状

参数
	src - 输入图像;通道数可以是任意的,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
	dst - 输出图像的大小和类型与src相同。
	kernel - 用于侵蚀的结构元素;如果element = Mat(),则使用3 x 3的矩形结构元素。可以使用getStructuringElement创建内核。
	anchor - 锚在元素内的位置;默认值(-1,-1)表示锚点位于元素中心。
	iterations - 施加腐蚀的次数。
	borderType - 像素外推方法
	borderValue - 边界不变时的边界值