day18:像素距离与连通域
作者:互联网
在图像形态学运算中,常将不与其他区域连接的独立区域称为集合或者连通域,这个集合中的
元素就是包含在连通域内的每一个像素,可以用该像素在图像中的坐标来
描述,像素之
间的距离可以用来表示两个连通域之间的关系.在了解图像形态学运算之前,首先需要了解图像中两个像素之间的距离描述方式,以及如何从图像中分离出不同的连通域。
欧式距离:
街道距离: d=|x1-x2|+|y1-y2| 棋盘距离: d=max(|x1-x2|,|y1-y2|),两个像素点X方向,y方向距离的最大值
代码:
void visionagin::Mydistancetransform()
{
Mat data = (Mat_<uchar>(5, 5) << 1, 1, 1, 1, 1,
1, 1, 1, 1, 1,
1, 1, 0, 1, 1,
1, 1, 1, 1, 1,
1, 1, 1, 1, 1);
Mat dststreet, dstouji, dstchess;
distanceTransform(data, dststreet, 1, 3, CV_8U);//计算街道距离
distanceTransform(data, dstouji, 2, 5, CV_8U);//计算欧几里得距离
distanceTransform(data, dstchess, 3, 3, CV_8U);//计算棋盘距离
cout << dststreet << endl;
cout << dstouji << endl;
cout << dstchess << endl;
Mat src=imread("C:\\Users\\86176\\Downloads\\visionimage\\rice.jfif");
if (src.empty())
{
cout << "open failed !" << endl;
}
imshow("原图", src);
Mat temp1,temp2, gry;
cvtColor(src, gry, COLOR_BGR2GRAY);
threshold(gry, temp1, 50, 255, THRESH_BINARY);//黑底白图
threshold(gry, temp2, 50, 255,THRESH_BINARY_INV);//白底黑图
imshow("黑底白图", temp1);
imshow("白底黑图", temp2);
Mat res1, res2;
distanceTransform(temp1, res1, 1, 3,CV_32F);//cv_32F显示更清晰
distanceTransform(temp2, res2, 1, 5,CV_8U);
imshow("黑底白图res1", res1);
imshow("白底黑图res2", res2);
}
结果:
原图及二值化后的图像:
距离变换后的结果:
标签:连通,距离,像素,y1,图像,x2,day18 来源: https://blog.csdn.net/m0_57747965/article/details/120750912