形态学处理(一)
1、腐蚀、膨胀操作
膨胀
简单来讲,膨胀操作就是选定窗口大小,然后在原图上滑动,窗口中心点的取值为窗口内所有像素点的最大值。
下给出过程图,个人认为下图比上面的解释图更为通俗易懂。
对单个像素的膨胀操作如下:
(1)请把下图看做是方格纸,黑色部分也是,第一张图为对像素(1,1)进行膨胀操作,红色框为选取的核大小:
(2)第二张图为对像素(2,2)进行膨胀操作
(3)依次类推,当窗口滑动过整幅图时,膨胀操作也就完成了。可以想象,如果核为3*3的话,结果与原图对比,会发现膨胀后白色部分像素增加了一圈。
腐蚀
腐蚀恰好与膨胀相反,即为窗口中心像素取值为窗口内各像素的最小值。
可看下面的操作:
对单个像素腐蚀操作如下:
红色框窗口内像素的最小值,即黑色,所以该像素腐蚀后变成黑色。
当红色框遍历完整幅图像时,腐蚀操作完成,可以想象,结果比原图小了一圈。
核心函数
一、膨胀
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);
}
测试结果:
总的来说,膨胀就是使白色部分面积增加,而腐蚀则使黑色部分面积增加