我目前正在一个项目中,以从图像中分离出车牌。
当我使用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]]
因此,我想要的是最后一个矩阵看起来与上面的矩阵相同。
答案 0 :(得分:1)
有两个原因导致观察到结果差异。
@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]