腐蚀运算的含义:每当在目标图像中找到一个与结构元素相同的子图像时,就把该子图像中与结构元素的原点位置对应的那个像素位置标注出来,目标图像上被标注出来的所有像素组成的集合,即为腐蚀运算的结果。其实质就是在目标图像中标出那些与结构元素相同的子图像的原点位置的像素。
算法描述:
1.获得源图像每行像素的宽度
2.创建一幅大小与源图像相同,所有像素置黑的目标图像
3.为防止越界,不处理最左边、最右边、最上边和最下边的像素,从第2行、第2列开始检查源图像中的像素点,先将当前点在目标图像中的对应像素点置白,如果当前点对应结构元素中为白色的那些点中有一个不是白色,则将目标图像中的对应像素点置为黑。
4.循环3步骤,直至处理完源图像
5.所得的目标图像即为腐蚀结果
编程实现:
结构元素为3*3的全置白矩阵,输入图像为二值图像
void corrode(Mat &img,uchar mask[3][3],int m,int n)//img为源图像,mask为结构元素,m,n为结构元素的大小
{
int width = img.cols;//源图像每行像素的宽度
Mat k(img.size(), img.type(), Scalar::all(0)); //创建一幅大小与源图像相同,所有像素置黑的目标图像
for (int i = 1; i < img.rows-1; i++)
{
uchar *data = img.ptr(i);
uchar *k_mask = k.ptr(i);
for (int j = 1; j < img.cols - 1; j++)
{
if (*data > 100)
{
k_mask[j] = 255;//先将当前点在目标图像中的对应像素点置白
for (int ii = 0; ii < m; ii++)
{
for (int jj = 0; jj < n; jj++)
{
if (mask[ii][jj] == 0)
continue;
uchar flag = *(data + (ii - 1)*width + (jj - 1));
if (flag < 100)
{
k_mask[j] = 0;//如果当前点对应结构元素中为白色的那些点中有一个不是白色,则将目标图像中的对应像素点置为黑 o9
break;
}
}
}
}
data++;
}
}
img = k;
}
int main()
{
uchar mask[3][3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
{
mask[i][j] = 255;
}
while (1)
{
Mat img = imread("5.jpg", 0);
imshow("显示1", img);
threshold(img, img, 240, 255, 0);
imshow("源图像", img);
corrode(img,mask,3,3);
imshow("腐蚀效果", img);
waitKey(10);
}
return 0;
}
膨胀运算的含义:先对结构元素B做关于其原点的反射得到反射集合B^,然后在目标图像X上将B^平移x,则那些B^平移后与目标图像X至少有一个非零公共元素相交时,对应的原点位置所组成的集合就是膨胀运算的结果。
算法描述:
1.获得源图像每行像素的宽度
2.创建一幅大小与源图像相同,所有像素置黑的目标图像
3.为防止越界,不处理最左边、最右边、最上边和最下边的像素,从第2行、第2列开始检查源图像中的像素点,如果当前点对应结构元素中为白色的那些点中只要有一个点是白色,则将目标图像中的当前像素点置为白。
4.循环3步骤,直至处理完源图像
5.所得的目标图像即为膨胀结果
编程实现:
结构元素为3*3的全置白矩阵,输入图像为二值图像
void expand(Mat &img, uchar mask[3][3], int m, int n)
{
int width = img.cols;//源图像每行像素的宽度
Mat k(img.size(), img.type(), Scalar::all(0)); //创建一幅大小与源图像相同,所有像素置黑的目标图像
for (int i = 1; i < img.rows - 1; i++)
{
uchar *data = img.ptr(i);
uchar *k_mask = k.ptr(i);
for (int j = 1; j < img.cols - 1; j++)
{
bool flag = 0;
for (int ii = 0; ii < m; ii++)
{
for (int jj = 0; jj < n; jj++)
{
if (*(data + (ii - 1)*width + (jj - 1)) != 0 && mask[ii][jj] != 0)
{
*k_mask = 255;
flag = 1;
break;
}
}
if (flag == 1) break;
}
k_mask++;
data++;
}
}
img = k;
}
int main()
{
uchar mask[3][3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
{
mask[i][j] = 255;
}
while (1)
{
Mat img = imread("5.jpg", 0);
imshow("显示1", img);
threshold(img, img, 240, 255, 0);
imshow("源图像", img);
expand(img,mask,3,3);
imshow("膨胀效果", img);
waitKey(10);
}
return 0;
}
效果: