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

📅  最后修改于: 2021-05-30 04:20:37             🧑  作者: Mango

形态转换是基于通常在二进制图像上执行的图像形状的简单操作。它获取我们的输入图像和一个决定操作性质的结构元素(内核)。

在本文中,我们将讨论腐蚀和膨胀的两种基本形态学过滤器。侵蚀侵蚀了边界并缩小了前景对象的大小,而“扩张”使边界扩大了,因此增加了前景对象的大小。之前,先详细了解它们是什么,然后再了解什么是结构化元素:

结构元素:结构元素是用于与给定图像进行交互的形状。它可以帮助我们根据其遗漏或适合图像的方式得出结论。它用于形态学操作,例如腐蚀,膨胀,打开,关闭,渐变,黑帽/大礼帽变换。 Open CV为内核矩形,十字形和椭圆形提供3种形状。

句法:

参数:以下是上述语法所需的参数:

  • shape:结构元素的形状可以是MORPH_RECTMORPH_ELLIPSEMORPH_CROSS之一
  • ksize:结构元素的大小
  • 锚:在结构元素内的锚位置。默认值为[-1,-1},表示位置为结构元素的中心。

返回值:具有指定大小和形状的结构元素(垫子对象)。

侵蚀

侵蚀是用于减小前景对象大小的形态操作。就像土壤侵蚀并侵蚀前景对象的边界一样。

在该操作中,内核通过图像滑动,并认为像素值1,只有当在结构化元素的所有像素具有值1。否则,它会被侵蚀。这样,边界附近的像素将被丢弃,并获得图像内部缩小的前景对象。

句法:

参数:

  • src:输入图像
  • dst:输出图像
  • 内核:用于侵蚀的结构元素。
  • 锚:在结构元素内的锚位置。默认值为[-1,-1},表示位置为结构元素的中心。
  • 迭代次数:施加腐蚀的次数。
  • borderType:边框类型( BORDER_CONSTANTBORDER_REPLICATE等)
  • borderValue:边框值

返回值:输出图像(垫子对象)

扩张

扩张与“侵蚀”相反,它不会收缩而是会扩展前景对象。在此操作中,结构化元素(内核)在图像中滑动。但是,如果至少一个像素具有值1,则此处为像素值1。因此,对象围绕边界扩展并生成扩展的图像。

句法:

参数:

  • src:输入图像
  • dst:输出图像
  • 内核:用于扩展的结构元素。
  • 锚:在结构元素内的锚位置。默认值为[-1,-1},表示位置为结构元素的中心。
  • 迭代次数:应用膨胀的次数。
  • borderType:边框类型( BORDER_CONSTANTBORDER_REPLICATE等)
  • borderValue:边框值

返回值:输出图像(垫子对象)

下面是实现上述概念的C++程序:

C++
// C++ program to implement the erosion
// and dilation
#include 
#include 
  
// Library to include for drawing shapes
#include 
#include 
using namespace cv;
using namespace std;
  
// Driver Code
int main(int argc, char** argv)
{
    // Reading the Image
    Mat image = imread("C:/Users/harsh/Downloads/geeks.png",
                       IMREAD_GRAYSCALE);
  
    // Check if the image is created
    // successfully or not
    if (!image.data) {
        std::cout << "Could not open or find"
                  << " the image\n";
        return 0;
    }
  
    // Create a structuring element (SE)
    int morph_size = 2;
    Mat element = getStructuringElement(
        MORPH_RECT, Size(2 * morph_size + 1,
                         2 * morph_size + 1),
        Point(morph_size, morph_size));
    Mat erod, dill;
  
    // For Erosion
    erode(image, erod, element,
          Point(-1, -1), 1);
  
    // For Dilation
    dilate(image, dill, element,
           Point(-1, -1), 1);
  
    // Display the image
    imshow("source", image);
    imshow("erosion", erod);
    imshow("dilate", dill);
    waitKey();
  
    return 0;
}


输出图像:

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”