关于距离变换函数distanceTransform使用注意事项

来源:互联网 发布:linux发行版 编辑:程序博客网 时间:2024/06/05 10:24
cv::Mat gray,bin;
cv::cvtColor(srcImg,gray,CV_RGB2GRAY);
cv::threshold(gray,bin,150,255,cv::THRESH_BINARY);
cv::imshow("二值图像",bin);
cv::Mat resultImgtemp;
cv::distanceTransform(bin,resultImgtemp,CV_DIST_L2,CV_DIST_MASK_PRECISE);

cv::normalize(resultImgtemp,resultImgtemp,0,1,cv::NORM_MINMAX);

----------注意----------

使用完distanceTransform得到的resultImgtemp矩阵里面的数据都是浮点型!!!!!!若直接cv::imshow("最终resultImg",resultImgtemp);得到的跟二值化图像一样的图!

原因如下:

-----------------------

显示图片 imshow

在窗口中显示图片,对于NORMAL的窗口,把图片缩放到窗口固定大小,再显示。根据图像数据的深度,对图像进行下面的处理:

8-bit unsigned 直接显示
16-bit unsigned or 32-bit integer 像素点值除以256,即把[0,255*256] 映射到 [0,255]
32-bit floating-point 像素点值乘以255,即把[0,1] 映射到 [0,255]

所以,imshow可以正常显示取值范围[0,255]的uchar型图像、取值范围[0,1]的float或double类型图像。

单通道uchar 类型Mat在显示图片时,Mat数据应在uchar数据范围内,即0~255。  若数据值不在0~255内,则Mat会以256为周期,把数据平移至0~255范围内。 比如 数据为256,则Mat会把数据转化成0,因此显示为黑色。

 若float数据<0,则会显示为黑色。若float数据>1,则会显示为白色。 

-------------------------------

所以使用完distanceTransform得到的resultImgtemp矩阵里面的数据都是浮点型!

由于只有前景有灰度值,背景为0,前景的灰度为float型>1则显示白色,所以不处理直接cv::imshow("最终resultImg",resultImgtemp);得到的跟二值化图像一样的图。

需要cv::normalize(resultImgtemp,resultImgtemp,0,1,cv::NORM_MINMAX);给归一化到0-1,这样显示的时候可以自动变换成0-255。



0 0