如何正确使用`cv2.imshow`为`cv2.distanceTransform`返回的浮点图像? [英] How to use `cv2.imshow` correctly for the float image returned by `cv2.distanceTransform`?

查看:2200
本文介绍了如何正确使用`cv2.imshow`为`cv2.distanceTransform`返回的浮点图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

cv2.imshow正在发生一些奇怪的事情。我正在编写一段代码并想知道为什么我的一个操作不起作用(通过观察cv2.imshow来诊断)。在恼怒的情况下,我最终将相同的图像写入文件,其中看起来很好。为什么cv2.imshow显示二进制图像(下面的第一张图像),而cv2.imwrite按预期写入灰度图像(第二张图像)?我以前从未遇到过显示灰度图像的问题!

  cv2.imshow('Latest',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

distTransform = cv2.distanceTransform(src = image,distanceType = cv2.DIST_L2,maskSize = 5)
cv2.imwrite ('distanceTransform.png',distTransform)

cv2.imshow('Latest',distTransform)
cv2.waitKey(0)
cv2.destroyAllWindows()

这是cv2.imshow显示的图像:



这是由imwrite保存的图像:

cv2.imshow 时,你应该知道:

  imshow(winname,mat) - >无
。该功能可以缩放图像,具体取决于其深度:
。 - 如果图像是8位无符号,则按原样显示。
。 - 如果图像是16位无符号或32位整数,则像素除以256.
即,值范围[0,255 \ * 256]映射到[0,255]。
。 - 如果图像是32位或64位浮点,则像素值乘以255.即
。值范围[0,1]映射到[0,255]。






函数 distaceTransform 返回类型 float 。因此,当直接显示dist时,它首先乘以255,然后映射到[0,255]。所以结果就像二进制图像一样。 (0 * 255 => 0,1 * 255 => 255,... * 255 => 255)



要正确显示



(1)你可以剪掉浮动广告至[0,255]并将数据类型更改为 np.uint8 cv2.convertScaleAbs

  dist1 = cv2.convertScaleAbs(dist)

(2)你也可以将float dist标准化为[0,255]并将数据类型改为 cv2.normalize

  dist2 = cv2.normalize(dist,None,255,0,cv2.NORM_MINMAX,cv2.CV_8UC1)






这是熊猫的一个例子:





结果:








Ful l代码:

 #!/ ust / bin / python3 
#2018.01.19 10:24:58 CST
img = cv2.imread(panda.png,0)
dist = cv2.distanceTransform(src = img,distanceType = cv2.DIST_L2,maskSize = 5)
dist1 = cv2.convertScaleAbs (dist)
dist2 = cv2.normalize(dist,None,255,0,cv2.NORM_MINMAX,cv2.CV_8UC1)

cv2.imshow(dist,dist)
cv2.imshow(dist1,dist1)
cv2.imshow(dist2,dist2)
cv2.waitKey()


Something weird is going on with cv2.imshow. I was writing a piece of code and wondering why one of my operations wasn't working (as diagnosed by observing cv2.imshow). In exasperation I ended up writing the very same image to a file wherein it looks fine. Why is cv2.imshow showing a binary image (first image below) while cv2.imwrite writing the grayscale image as intended (second image)? I've never had problems with displaying grayscale images before!

cv2.imshow('Latest', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

distTransform = cv2.distanceTransform(src=image,distanceType=cv2.DIST_L2,maskSize=5)
cv2.imwrite('distanceTransform.png', distTransform)

cv2.imshow('Latest', distTransform)
cv2.waitKey(0)
cv2.destroyAllWindows()

This is the image as it's displayed by cv2.imshow:

This is the image as it's saved by imwrite:

解决方案

When use cv2.imshow, you should know:

imshow(winname, mat) -> None
. The function may scale the image, depending on its depth:
. - If the image is 8-bit unsigned, it is displayed as is.
. - If the image is 16-bit unsigned or 32-bit integer, the pixels are divided by 256. 
    That is, the value range [0,255\*256] is mapped to [0,255].
. - If the image is 32-bit or 64-bit floating-point, the pixel values are multiplied by 255. That is, the
.   value range [0,1] is mapped to [0,255].


The function distaceTransform return type float. So when directly display the dist, it first multiply 255, then map to [0,255]. So the result just like binary image. (0*255=>0, 1*255=>255, ...*255=>255).

To display correctly:

(1) you can clip the float dist to [0,255] and change the datatype to np.uint8 by cv2.convertScaleAbs

dist1 = cv2.convertScaleAbs(dist)

(2) you can also normalize float dist to [0,255] and change datatype by cv2.normalize

dist2 = cv2.normalize(dist, None, 255,0, cv2.NORM_MINMAX, cv2.CV_8UC1)


Here is an example with panda:

The result:


Full code:

#!/ust/bin/python3
# 2018.01.19 10:24:58 CST
img = cv2.imread("panda.png", 0)
dist = cv2.distanceTransform(src=img,distanceType=cv2.DIST_L2,maskSize=5)
dist1 = cv2.convertScaleAbs(dist)
dist2 = cv2.normalize(dist, None, 255,0, cv2.NORM_MINMAX, cv2.CV_8UC1)

cv2.imshow("dist", dist)
cv2.imshow("dist1", dist1)
cv2.imshow("dist2", dist2)
cv2.waitKey()

这篇关于如何正确使用`cv2.imshow`为`cv2.distanceTransform`返回的浮点图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆