opencv CV_32F图象显示

img

opencv打开32位浮点型的图象显示如右图,系统自带的图片查看器(同PS的显示)如左图

opencv对32位浮点型到8位无符号整型的转换应该是 value * 255.0,而图片查看器和PS好像对value值做了一个特殊转换,转换的关系大概为

img

请问图片查看器和PS为什么要做一个这样的转换?

32位浮点型图片:

https://download.csdn.net/download/zhouwucq/88086817

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7573102
  • 除此之外, 这篇博客: [OpenCV实战]31 使用OpenCV将一个三角形仿射变换到另一个三角形中的 2.4 计算仿射变换矩形 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    我们刚刚在裁剪的输入和输出图像中获得了输入和输出三角形的坐标。使用这两个三角形,我们可以找到仿射变换,它将使用以下代码将输入三角形转换为裁剪图像中的输出三角形。

    C++:

    // Given a pair of triangles, find the affine transform.
    Mat warpMat = getAffineTransform( tri1Cropped, tri2Cropped );

    Python:

    # Given a pair of triangles, find the affine transform.
    warpMat = cv2.getAffineTransform( np.float32(tri1Cropped), np.float32(tri2Cropped) )
  • 以下回答由chatgpt基于相关博客总结生成:

    问题标题: 图像查看器和PS为什么在显示32位浮点型图像时要进行特殊转换?

    在图像查看器和PS中,显示32位浮点型图像时需要进行特殊转换的原因是因为它们使用的是标准的8位或16位图像展示方式。例如,常见的JPEG格式只支持8位图像,因此必须将32位浮点型图像转换为8位无符号整型图像才能显示。

    在OpenCV中,将32位浮点型图像转换为8位无符号整型图像的方法是使用公式 value * 255.0 进行缩放。这样做的目的是将图像的像素值映射到0-255的范围内,使其能够被8位无符号整型图像正确显示。这种缩放方式不会改变图像本身的颜色或信息。

    而在图像查看器和PS中,它们可能会使用不同的转换方法来处理32位浮点型图像。例如,它们可能会将像素值进行舍入或取整操作,以在8位或16位的显示范围内呈现图像。这样做可能会损失一部分图像的细节或精度,但可以在有限的显示范围内更好地展示图像。

    对于图像查看器和PS的具体实现细节,我们可以通过下面的代码示例来了解转换的过程:

    import cv2
    import numpy as np
    
    # 加载图像
    image = cv2.imread('example_image.png', cv2.IMREAD_UNCHANGED)
    
    # 判断图像深度
    depth = image.dtype
    if depth == np.float32:
        # 将32位浮点型图像转换为0-255范围内的8位无符号整型图像
        image = (image * 255).astype(np.uint8)
    
    # 在OpenCV中显示图像
    cv2.imshow('OpenCV Image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在上述示例代码中,我们首先加载图像,并判断其深度是否为32位浮点型。如果是的话,我们使用公式 image = (image * 255).astype(np.uint8) 将图像转换为8位无符号整型图像。然后使用OpenCV的imshow函数显示图像。

    通过以上步骤,我们可以将32位浮点型图像转换为8位无符号整型图像,并在OpenCV中正确显示。但对于图像查看器和PS,它们可能会有自己的转换方式,具体的实现细节可能因软件版本和算法策略而有所不同。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^