问题描述
cv2.imshow 发生了一些奇怪的事情.我正在编写一段代码并想知道为什么我的一个操作不起作用(通过观察 cv2.imshow 诊断出).令人恼火的是,我最终将完全相同的图像写入了一个看起来不错的文件.为什么 cv2.imshow 显示二进制图像(下面的第一张图像),而 cv2.imwrite 按预期写入灰度图像(第二张图像)?我以前从未遇到过显示灰度图像的问题!
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()
这是 cv2.imshow 显示的图像:
This is the image as it's displayed by cv2.imshow:
这是 imwrite 保存的图像:
This is the image as it's saved by imwrite:
推荐答案
使用cv2.imshow
时,你应该知道:
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].
函数distaceTransform
返回类型float
.所以直接显示dist的时候,先乘以255,然后映射到[0,255].所以结果就像二进制图像.(0*255=>0, 1*255=>255, ...*255=>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)
.
正确显示:
(1) 您可以将浮动 dist 剪辑为 [0,255] 并通过 cv2.convertScaleAbs
(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) 您还可以将 float dist 规范化为 [0,255] 并通过 cv2.normalize
(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:
结果:
完整代码:
#!/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.distanceTransform`返回的浮动图像正确使用`cv2.imshow`?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!