通过了解腐蚀的基本原理后,下面根据自己的理解用c++实现
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
/**********************************************
功能:3*3结构元素的二值图像的腐蚀
参数:_src-输入图像
dst-输出图像
se-模板
***********************************************/
void erode(const Mat _src,Mat& dst,int se[3][3])
{
Mat src;
_src.copyTo(src);
if (src.empty())
{
cout << "图片传入失败!!!" << endl;
return;
}
_src.copyTo(dst);
int nTemp = 0;
for (int m = 0; m < 3; m++)
{
for (int n = 0; n < 3; n++)
{
if (se[m][n] == 1)
nTemp++;
}
}
//逐行扫描图像,为防止越界,四周留出一个像素的空边
for (int i = 1; i < src.rows - 1; i++)
{
uchar* data = dst.ptr<uchar>(i);
for (int j = 1; j < src.cols - 1; j++)
{
int count = 0;
for (int k = 0; k < 3; k++)
{
for (int l = 0; l < 3; l++)
{
if (se[k][l] == -1)//不关心
continue;
if (se[k][l] == 1)//前景
{
if (src.at<uchar>(i - 1 + k, j - 1 + l) != 0)
{
count++;
}
}
else if (se[k][l]==0)//背景
{
if (src.at<uchar>(i - 1 + k, j - 1 + l) != 255)
{
count++;
}
}
else
{
cout << "模板结构元素错误!!!" << endl;
return;
}
}
}
if (nTemp != count)
{
data[j] = 0;
}
}
}
}
/**************************************************
功能:二值图像的膨胀
参数:参数:_src-输入图像
dst-输出图像
se-模板
***************************************************/
void dilate(const Mat _src, Mat& dst, int se[3][3])
{
Mat src;
_src.copyTo(src);
if (src.empty())
{
cout << "图片传入失败!!!" << endl;
return;
}
_src.copyTo(dst);
//计算se关于中心的对成集
int nTemp;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3 - i; j++)
{
nTemp = se[i][j];
se[i][j] = se[2 - i][2 - j];
se[2 - i][2 - j] = nTemp;
}
}
//逐行扫描图像,为防止越界,四周留出一个像素的空边
for (int i = 1; i < src.rows - 1; i++)
{
uchar* data = src.ptr<uchar>(i);
for (int j = 1; j < src.cols - 1; j++)
{
if (data[j] != 0)
{
for (int k = 0; k < 3; k++)
{
for (int l = 0; l < 3; l++)
{
if (se[k][l] == -1)
continue;
if (se[k][l] == 1)
{
dst.at<uchar>(i - 1 + k, j - 1 + l) = 255;
}
else
{
cout << "模板结构元素错误!!!" << endl;
return;
}
}
}
}
}
}
}
int main()
{
Mat src = imread("test1.jpg",0);
Mat src_binary;
threshold(src, src_binary,250, 255, THRESH_BINARY);
imshow("原始图像", src_binary);
int se[3][3] = { { -1, 1, -1 }, { 1, 1, 1 }, {1,1,1} };
Mat dst;
dilate(src_binary, dst, se);
//erode(dst, dst, se);
dilate(dst, dst, se);
Mat dstImg;
addWeighted(src,1.0, dst,-1.0, 0.0,dstImg);
imshow("处理后", dst);
imshow("处理结果", dstImg);
waitKey(0);
return 0;
}
原始图像:
处理后的结果: