八、使用OpenCV徒手实现:膨胀、腐蚀、开、闭

点击链接→【数字图像处理】简单实践汇总

1. 腐蚀

Mat fushi(Mat srcImag)
{
	Mat outImag = srcImag.clone();
	for (int i = 1; i < srcImag.rows - 1; i++)
	{
		for (int j = 1; j < srcImag.cols - 1; j++)
		{
			if (srcImag.at<uchar>(i, j) > 150)
			{
				outImag.at<uchar>(i - 1, j - 1) = 255;
				outImag.at<uchar>(i - 1, j) = 255;
				outImag.at<uchar>(i - 1, j + 1) = 255;
				outImag.at<uchar>(i, j - 1) = 255;
				outImag.at<uchar>(i, j) = 255;
				outImag.at<uchar>(i, j + 1) = 255;
				outImag.at<uchar>(i + 1, j - 1) = 255;
				outImag.at<uchar>(i + 1, j) = 255;
				outImag.at<uchar>(i + 1, j + 1) = 255;
			}
		}
	}
	return outImag;
}

2. 膨胀

Mat pengzhang(Mat srcImag)
{
	Mat outImag = srcImag.clone();
	for (int i = 1; i < srcImag.rows - 1; i++)
	{
		for (int j = 1; j < srcImag.cols - 1; j++)
		{
			if (srcImag.at<uchar>(i, j) < 150)
			{
				outImag.at<uchar>(i - 1, j - 1) = 0;
				outImag.at<uchar>(i - 1, j) = 0;
				outImag.at<uchar>(i - 1, j + 1) = 0;
				outImag.at<uchar>(i, j - 1) = 0;
				outImag.at<uchar>(i, j) = 0;
				outImag.at<uchar>(i, j + 1) = 0;
				outImag.at<uchar>(i + 1, j - 1) = 0;
				outImag.at<uchar>(i + 1, j) = 0;
				outImag.at<uchar>(i + 1, j + 1) = 0;
			}
		}
	}
	return outImag;
}

3. 开闭

  • 开:先腐蚀后膨胀;
  • 闭:先膨胀后腐蚀;
	Mat srcImage = imread(SRC_IMAGE_6_0, 0);
	imshow(WIMDOW_NAME, srcImage);
	Mat src_fushi = fushi(srcImage);
	Mat src_pengzhang = pengzhang(srcImage);
	Mat src_kai = pengzhang(fushi(srcImage));//开:先腐蚀后膨胀
	Mat src_bi = fushi(pengzhang(srcImage)); //闭:先膨胀后腐蚀
	
	imshow(WIMDOW_NAME_FUSHI, src_fushi);
	imshow(WIMDOW_NAME_PENGZHANG, src_pengzhang);
	imshow(WIMDOW_NAME_KAI, src_kai);
	imshow(WIMDOW_NAME_BI, src_bi);

4. 效果

注意: 在我的理解里,腐蚀和膨胀,都是针对目标图像,而不一定是白色或者黑色(黑白图像),所以效果展示的时候,都是基于 指纹 说的。如果直接调用库的话,应该一个和我一样,一个和我相反。

  • 白底黑纹:

在这里插入图片描述
在这里插入图片描述

  • 黑底白纹:

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34451909/article/details/107613079