形态学处理(一)


1、腐蚀、膨胀操作

 


膨胀

 

opencv膨胀腐蚀圆 opencv图像腐蚀和膨胀_#include

简单来讲,膨胀操作就是选定窗口大小,然后在原图上滑动,窗口中心点的取值为窗口内所有像素点的最大值。

下给出过程图,个人认为下图比上面的解释图更为通俗易懂。

对单个像素的膨胀操作如下: 

(1)请把下图看做是方格纸,黑色部分也是,第一张图为对像素(1,1)进行膨胀操作,红色框为选取的核大小:

opencv膨胀腐蚀圆 opencv图像腐蚀和膨胀_#include_02

(2)第二张图为对像素(2,2)进行膨胀操作 

opencv膨胀腐蚀圆 opencv图像腐蚀和膨胀_最小值_03

(3)依次类推,当窗口滑动过整幅图时,膨胀操作也就完成了。可以想象,如果核为3*3的话,结果与原图对比,会发现膨胀后白色部分像素增加了一圈。


腐蚀

opencv膨胀腐蚀圆 opencv图像腐蚀和膨胀_opencv膨胀腐蚀圆_04

腐蚀恰好与膨胀相反,即为窗口中心像素取值为窗口内各像素的最小值。

可看下面的操作:

对单个像素腐蚀操作如下: 

红色框窗口内像素的最小值,即黑色,所以该像素腐蚀后变成黑色。

opencv膨胀腐蚀圆 opencv图像腐蚀和膨胀_opencv膨胀腐蚀圆_05

 当红色框遍历完整幅图像时,腐蚀操作完成,可以想象,结果比原图小了一圈。


核心函数

一、膨胀

void dilate( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
  • src:原图像。
  • dst:目标图像。
  • element:腐蚀操作的内核。 如果不指定,默认为一个简单的  矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement().
  • anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。
  • iterations:腐蚀次数。省略时为默认值1。
  • borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。
  • borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。

二、腐蚀

void erode( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
  •  src:原图像。
  • dst:目标图像。
  • element:腐蚀操作的内核。 如果不指定,默认为一个简单的  矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement().
  • anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。
  • iterations:腐蚀次数。省略时为默认值1。
  • borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。
  • borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。

三、创建核

Mat getStructuringElement(int shape, Size esize, Point anchor=Point(-1,-1));
  •  shape:内核形状,主要有MORPH_RECT,MORPH_CROSS和MORPH_ELLIPSE,分别为矩形、椭圆形和交叉形,对应的值分别为0,1,2

测试代码

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void main()
{
	Mat srcImg = imread("F:\\opencv_re_learn\\test.jpg");
	if (!srcImg.data){
		cout << "failed to read" << endl;
		system("pause");
		return;
	}
	imshow("src", srcImg);
	Mat srcGray;
	cvtColor(srcImg, srcGray, CV_BGR2GRAY);
	Mat thresh;
	threshold(srcGray, thresh, 100, 255, CV_THRESH_BINARY_INV
		| CV_THRESH_OTSU);
	imshow("thresh", thresh);
	//自定义核
	Mat element = getStructuringElement(MORPH_RECT,
		Size(8, 8));
	//膨胀
	Mat dilate_result;
	dilate(thresh, dilate_result, element);
	imshow("膨胀结果", dilate_result);
	//腐蚀
	Mat erode_result;
	erode(thresh, erode_result, element);
	imshow("腐蚀结果", erode_result);
	waitKey(0);
}

测试结果:

总的来说,膨胀就是使白色部分面积增加,而腐蚀则使黑色部分面积增加

opencv膨胀腐蚀圆 opencv图像腐蚀和膨胀_opencv膨胀腐蚀圆_06