将图片乘以255

时间:2019-06-22 06:42:40

标签: python opencv image-processing cv2

我目前正在一个项目中,以从图像中分离出车牌。

当我使用cv2.imread("filename",0)导入图像时,我获得的灰度图像大致相同(由于我将其转换为整数这一事实,可能会有一些舍入差异。) {1}},然后使用cv2.imread("filename")将其转换为灰度。

但是,当我将两个np.dot(original_image[...,:3], [0.299, 0.587, 0.144])ndarrays相乘时,我不会获得相同的输出矩阵。这两张灰度图像的尺寸相同,将它们转换为数字时它们产生相同的输出,它们的类型相同并且产生相同的255阈值。为什么会这样? OpenCV显示和保存图像otsu是否有所不同?

在将第二个灰度图像乘以255后,如何处理第二个灰度图像以产生与第一个灰度图像相同的输出?

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]]

因此,我想要的是最后一个矩阵看起来与上面的矩阵相同。

1 个答案:

答案 0 :(得分:1)

有两个原因导致观察到结果差异。

  1. 数据类型上的差异
  2. 渠道订单

@Cris Luengo在评论中指出的第一个原因是a { display: block; padding: 40px 70px; } gray_image之间的数据类型差异。 rgb_converted_to_gray_image的类型为gray_image,而uint8的类型为rgb_converted_to_gray。由于乘以255,float32的值被缩放到gray_image的范围内。要解决此问题,只需将uint8更改为255即可进行浮点乘法。

255.0

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

0.144

最终代码如下:

[0.114, 0.587, 0.299]