gpt4 book ai didi

python - imshow 对此图像执行什么颜色转换(或其他操作)

转载 作者:太空宇宙 更新时间:2023-11-03 21:21:28 24 4
gpt4 key购买 nike

我制作了一个非常简单的程序,它读取图像、计算 sobel 滤波器,然后用 imshow 显示它。

import cv2
img = cv2.imread("/home/alex/imagens/train_5.jpg")

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) # x
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
norm = cv2.magnitude(sobelx, sobely)

normUint8 = norm.astype('uint8')

cv2.imshow("img", img)
cv2.imshow("norm", norm)
cv2.imshow("normUint8", normUint8)

print "img=" + str(img.dtype) + ", sobel=" + str(norm.dtype) + ", normUint8=" + str(normUint8.dtype)

cv2.waitKey(0)
cv2.destroyAllWindows()

这里附上结果。 enter image description here

我预计显示 norm 和 normUint8 的结果会相同或非常相似,因为它们的值在每个像素上的差异小于 1。因此,当我使用 CV_64FC3 图像时,我相信 opencv 在呈现它之前正在执行一些操作。

我有兴趣找到这个操作以便使用它。

有人可以帮忙吗?

这里附上我使用的原图。

enter image description here

谢谢。

最佳答案

您正在向 imshow 提供 64FC3(3 channel ,64 位 float )图像.此功能的文档说明:

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 floating-point, the pixel values are multiplied by 255. That is, the value range [0,1] is mapped to [0,255].

即使未提及 64 位 float ,我们也可以合理假设它们的处理方式与 32 位 float 相同。如果我们查看源代码,我们会发现转换是由函数 cvConvertImage 完成的。 .具体来说,关于 line 622

double scale = src_depth <= CV_8S ? 1 : src_depth <= CV_32S ? 1./256 : 255;

为那些不熟悉枚举类型顺序的人解释一下,它是 8U、8S、16U、16S、32S、32F、64F。因此,字节没有缩放,其他整数除法,其余( float )乘法。

由于显示我们需要一个 8 位图像,重要的是要注意缩放将以饱和度完成(在这种情况下,任何超过 255 的都变成 255,任何低于 0 的都变成 0)。


现在已经清楚 imshow 做了什么样的转换,让我们来看看为什么您会在一片白色的海洋中看到这些色 block 。

由于将 norm 简单转换为 uint8 得到的图像不是全黑的,我们可以安全地假设 norm 的值[0.0-1.0]范围内。当值按 255 缩放时,任何大于或等于 1.0 的值都将变为 255(白色)。由于是 3 channel 图像,我们最终可能会发现只有部分 channel 不饱和的地方,因此我们会看到各种色 block 。

我们可以通过以下脚本来模拟这种行为:

b,g,r = cv2.split(norm)

r = np.uint8(np.where(r < 1.0, 0, 255))
g = np.uint8(np.where(g < 1.0, 0, 255))
b = np.uint8(np.where(b < 1.0, 0, 255))

cv2.imwrite('sobel_out.png', cv2.merge([b,g,r]))

我们将值 < 1.0 的像素设置为黑色,其他一切都变为白色。当我们组合平面时,我们得到以下图像:

看起来很眼熟?


注意:我怀疑方形图案来自您用于输入的 JPEG 压缩。

关于python - imshow 对此图像执行什么颜色转换(或其他操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44787104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com