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

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。



  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值