📜  侵蚀和膨胀| C++中OpenCV的形态转换(1)

📅  最后修改于: 2023-12-03 15:22:27.699000             🧑  作者: Mango

侵蚀和膨胀:C++中OpenCV的形态转换

形态转换是一种图像处理技术,用于对二值化图像进行膨胀、侵蚀、开运算和闭运算等操作。这种技术常用于去除噪声、填充空洞、分离连接的区域、识别并提取目标等领域。

侵蚀

侵蚀是一种图像处理操作,用于缩小或者删除目标区域,有利于去除噪声、分离细小物体、提取轮廓等。基本思想是通过滑动结构元素在二值化图像上进行像素相乘运算,如果结构元素完全覆盖原图像的像素,则输出为1,否则输出为0。具体实现可以使用OpenCV的erode函数。

以下是一个示例,展示如何对一个二值化图像进行侵蚀操作:

#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
    Mat inputImage = imread("test_image.jpg", IMREAD_GRAYSCALE); // 读取灰度图像
    Mat binaryImage;
    threshold(inputImage, binaryImage, 128, 255, THRESH_BINARY); // 二值化处理

    Mat structureElement = getStructuringElement(MORPH_RECT, Size(3, 3)); // 定义结构元素
    Mat outputImage;
    erode(binaryImage, outputImage, structureElement); // 侵蚀操作

    imshow("Input Image", inputImage);
    imshow("Binary Image", binaryImage);
    imshow("Eroded Image", outputImage);
    waitKey(0);
    return 0;
}

在上述代码中,首先读取了一张灰度图像,并对其进行二值化处理。随后使用getStructuringElement函数定义了一个3x3的矩形结构元素,然后使用erode函数对二值化图像进行了侵蚀操作,最后将结果显示出来。

膨胀

膨胀是一种图像处理操作,用于扩大或者增加目标区域,有利于填充空洞、连接薄弱的线段、实现形态学记号等。基本思想是通过滑动结构元素在二值化图像上进行像素相加运算,如果结构元素和原图像有重叠,则输出为1,否则输出为0。具体实现可以使用OpenCV的dilate函数。

以下是一个示例,展示如何对一个二值化图像进行膨胀操作:

#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
    Mat inputImage = imread("test_image.jpg", IMREAD_GRAYSCALE); // 读取灰度图像
    Mat binaryImage;
    threshold(inputImage, binaryImage, 128, 255, THRESH_BINARY); // 二值化处理

    Mat structureElement = getStructuringElement(MORPH_RECT, Size(3, 3)); // 定义结构元素
    Mat outputImage;
    dilate(binaryImage, outputImage, structureElement); // 膨胀操作

    imshow("Input Image", inputImage);
    imshow("Binary Image", binaryImage);
    imshow("Dilated Image", outputImage);
    waitKey(0);
    return 0;
}

在上述代码中,首先读取了一张灰度图像,并对其进行二值化处理。随后使用getStructuringElement函数定义了一个3x3的矩形结构元素,然后使用dilate函数对二值化图像进行了膨胀操作,最后将结果显示出来。

总结

形态转换是一种简单有效的图像处理技术,可以用于去除噪声、填充空洞、分离连接的区域、识别并提取目标等领域。在OpenCV中,可以使用erode函数和dilate函数实现侵蚀和膨胀操作,需要指定结构元素的形状和大小。