天天看点

OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)

腐蚀与膨胀(Eroding and Dilating)

目标

本文档尝试解答如下问题:

  • 如何使用OpenCV提供的两种最基本的形态学操作,腐蚀与膨胀( Erosion 与 Dilation):
    • erode
    • dilate

原理

Note

以下内容来自于Bradski和Kaehler的大作: Learning OpenCV .

形态学操作

  • 简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。
  • 最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:
    • 消除噪声
    • 分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
    • 寻找图像中的明显的极大值区域或极小值区域。
  • 通过以下图像,我们简要来讨论一下膨胀与腐蚀操作(译者注:注意这张图像中的字母为黑色,背景为白色,而不是一般意义的背景为黑色,前景为白色):
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)

膨胀

  • 此操作将图像 
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)
     与任意形状的内核 (
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)
    ),通常为正方形或圆形,进行卷积。
  • 内核 
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)
     有一个可定义的 锚点, 通常定义为内核中心点。
  • 进行膨胀操作时,将内核 
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)
     划过图像,将内核 
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)
     覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。对上图采用膨胀操作我们得到:
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)

背景(白色)膨胀,而黑色字母缩小了。

腐蚀

  • 腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。
  • 进行腐蚀操作时,将内核 
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)
     划过图像,将内核 
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)
     覆盖区域的最小相素值提取,并代替锚点位置的相素。
  • 以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了。
    OpenCV腐蚀与膨胀(Eroding and Dilating)腐蚀与膨胀(Eroding and Dilating)

源码

下面是本教程的源码, 你也可以从 here 下载。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "highgui.h"
#include <stdlib.h>
#include <stdio.h>

using namespace cv; /// 全局变量 Mat src, erosion_dst, dilation_dst; int erosion_elem = 0; int erosion_size = 0; int dilation_elem = 0; int dilation_size = 0; int const max_elem = 2; int const max_kernel_size = 21; /** Function Headers */ void Erosion( int, void* ); void Dilation( int, void* ); /** @function main */ int main( int argc, char** argv ) { /// Load 图像 src = imread( argv[1] ); if( !src.data ) { return -1; } /// 创建显示窗口 namedWindow( "Erosion Demo", CV_WINDOW_AUTOSIZE ); namedWindow( "Dilation Demo", CV_WINDOW_AUTOSIZE ); cvMoveWindow( "Dilation Demo", src.cols, 0 ); /// 创建腐蚀 Trackbar createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo", &erosion_elem, max_elem, Erosion ); createTrackbar( "Kernel size:\n 2n +1", "Erosion Demo", &erosion_size, max_kernel_size, Erosion ); /// 创建膨胀 Trackbar createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo", &dilation_elem, max_elem, Dilation ); createTrackbar( "Kernel size:\n 2n +1", "Dilation Demo", &dilation_size, max_kernel_size, Dilation ); /// Default start Erosion( 0, 0 ); Dilation( 0, 0 ); waitKey(0); return 0; } /** @function Erosion */ void Erosion( int, void* ) { int erosion_type; if( erosion_elem == 0 ){ erosion_type = MORPH_RECT; } else if( erosion_elem ==       

转载于:https://www.cnblogs.com/GarfieldEr007/p/5292310.html

继续阅读