点击链接→【数字图像处理】简单实践汇总
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. 效果
注意: 在我的理解里,腐蚀和膨胀,都是针对目标图像,而不一定是白色或者黑色(黑白图像),所以效果展示的时候,都是基于 指纹 说的。如果直接调用库的话,应该一个和我一样,一个和我相反。
- 白底黑纹:
- 黑底白纹: