将图像导入为灰度并将其转换为灰度不会在将其乘以255时产生相同的结果

2024-06-02 19:05:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个项目,从图像中分离出一个车牌号。你知道吗

当我使用cv2.imread("filename",0)导入图像时,我获得的灰度图像与使用cv2.imread("filename")导入图像然后使用np.dot(original_image[...,:3], [0.299, 0.587, 0.144])将其转换为灰度图像时或多或少相同(可能由于我将其转换为整数而存在一些舍入差异)。你知道吗

然而,当我将ndarrays255相乘时,我得到的输出矩阵并不相同。两个灰度图像具有相同的尺寸,在我将它们转换为图形时产生相同的输出,具有相同的类型并产生相同的otsu阈值。为什么会这样?OpenCV是否以不同的方式显示和保存图像ndarrays?你知道吗

如何操作第二个灰度图像,使其与255相乘后产生与第一个灰度图像相同的输出?你知道吗

def func():
    rgb_image=cv2.imread('filename')
    gray_image=cv2.imread('filename',0)

    rgb_converted_to_gray_image=np.dot(rgb_image[...,:3], [0.299, 0.587, 0.144])

    print("Before multiplying with 255")
    print(gray_image)
    print("------------")
    print(rgb_converted_to_gray_image)

    gray_image=gray_image*255
    rgb_converted_to_gray_image=rgb_converted_to_gray_image*255

    print("After multiplying with 255")
    print(gray_image)
    print("------------")
    print(rgb_converted_to_gray_image)

输出如下:

与255相乘之前

[[32 29 34 ... 92 88 86]
 [33 28 32 ... 85 85 86]
 [35 29 28 ... 85 93 99]
 ...
 [ 8  8  8 ... 32 32 32]
 [ 8  8  8 ... 32 32 32]
 [ 8  8  8 ... 33 33 33]]
------------
[[ 27.512  24.721  29.129 ... 105.014 100.894  98.989]
 [ 29.14   23.99   27.069 ...  97.804  97.804  99.432]
 [ 30.912  25.02   23.547 ...  98.701 106.797 112.977]
 ...
 [  9.292   9.292   9.292 ...  33.558  33.558  33.558]
 [  9.292   9.292   9.292 ...  33.558  33.558  33.558]
 [  9.292   9.292   9.292 ...  34.588  34.588  34.588]]

与255相乘后:

[[224 227 222 ... 164 168 170]
 [223 228 224 ... 171 171 170]
 [221 227 228 ... 171 163 157]
 ...
 [248 248 248 ... 224 224 224]
 [248 248 248 ... 224 224 224]
 [248 248 248 ... 223 223 223]]
------------
[[ 7015.56   6303.855  7427.895 ... 26778.57  25727.97  25242.195]
 [ 7430.7    6117.45   6902.595 ... 24940.02  24940.02  25355.16 ]
 [ 7882.56   6380.1    6004.485 ... 25168.755 27233.235 28809.135]
 ...
 [ 2369.46   2369.46   2369.46  ...  8557.29   8557.29   8557.29 ]
 [ 2369.46   2369.46   2369.46  ...  8557.29   8557.29   8557.29 ]
 [ 2369.46   2369.46   2369.46  ...  8819.94   8819.94   8819.94 ]]69.46  ...  8819.94   8819.94   8819.94 ]]

因此,我希望最后一个矩阵看起来和上面的一样。你知道吗


Tags: to图像imagenp矩阵rgbfilenamecv2
1条回答
网友
1楼 · 发布于 2024-06-02 19:05:54

有两个原因导致了结果的差异。你知道吗

  1. 数据类型差异
  2. 通道顺序

正如@Cris Luengo在评论中指出的,第一个原因是gray_imagergb_converted_to_gray_image之间的数据类型差异。gray_image具有类型uint8,而rgb_converted_to_gray具有类型float32。作为乘255的结果,gray_image的值被缩放到uint8的范围。为了解决这个问题,只需将255更改为255.0,就可以进行浮点乘法。你知道吗

gray_image = gray_image * 255.0

现在是第二个问题。即使我们进行浮点乘法,结果也会有所不同,因为OpenCV图像在默认情况下是按通道顺序BGR存储的,而您是按RGB顺序提供灰度转换系数。另外,蓝色值的系数不正确。它应该是0.114,而不是0.144。要验证RGB系数值的逻辑正确性,请检查它们的总和是否应等于1。校正系数数组应如下所示:

[0.114, 0.587, 0.299]

最终代码可能如下所示:

def func():
    rgb_image=cv2.imread('filename')
    gray_image=cv2.imread('filename',0)

    rgb_converted_to_gray_image=np.dot(rgb_image[...,:3], [0.114, 0.587, 0.299])

    print("Before multiplying with 255")
    print(gray_image)
    print("      ")
    print(rgb_converted_to_gray_image)

    gray_image=gray_image*255.0
    rgb_converted_to_gray_image=rgb_converted_to_gray_image*255

    print("After multiplying with 255")
    print(gray_image)
    print("      ")
    print(rgb_converted_to_gray_image)

相关问题 更多 >