python - 为 OpenCV imshow 连接 Numpy 数组

标签 python arrays numpy opencv

使用 OpenCV 和 Python,我想显示一个图像的左半部分与另一图像的右半部分连接,两者的大小相同 - 512x512 像素。我已经确定了几种方法来做到这一点,但我对一种方法的行为感到困惑。在下面的代码中,假设任何时候只使用了一种方法,其余的都被注释掉了:

import cv2
import numpy as np

image1 = cv2.imread('img1.png',0)
image2 = cv2.imread('img2.png',0)

#Method 1 - works
image3 = np.concatenate([image1[:,0:256], image2[:,256:512]], axis=1)

#Method 2 - works
image3 = image1[:,:]
image3[:,256:512] = image2[:,256:512]

#Method 3 - works if I don't create image3 with np.zeros first. 
#Otherwise displays black image - all zeros - but print displays correct values
image3 = np.zeros(shape=(512,512), dtype=int)
image3[:,0:256] = image1[:,0:256]
image3[:,256:512] = image2[:,256:512]
print(image3)

cv2.imshow("IMAGE", image3)
cv2.waitKey(0)
cv2.destroyAllWindows()

在方法 3 中,我起初错误地认为需要先创建新的 numpy 数组图像 3,因此创建了一个用零填充的数组,然后似乎用正确的值覆盖了该数组。当我打印该数组时,它会显示正确的值,但是当我使用 cv2.imshow 将其显示为图像时,它是全黑的(即全零)。为什么有区别?我知道切片会创建一个 View ,而不是副本,但是有人可以解释一下方法 3 中发生了什么以及为什么 cv2.imshow 显示底层数组但 print 不显示。

最佳答案

你的问题在于:

np.zeros(shape=(512,512), dtype=int)
imshow将显示编码为浮点(32 位)的图像,范围为 0.-1。或 8 位(1-4 channel ),范围为 0-255。您正在使用 int,它是 32 位(在大多数情况下),它不是浮点数。你应该做些什么来修复它,是使用 np.uint8 .
np.zeros(shape=(512,512), dtype=np.uint8)

我认为它也可以使用 matplotlib 显示如果您想保留 int ,但我不是 100% 确定的。

关于python - 为 OpenCV imshow 连接 Numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699558/

相关文章:

python - 处理 BeautifulSoup CSS 选择器中的冒号

python - 如何将参数传递给 Tkinter 按钮的回调命令?

c# - 将字符串 [] 转换为整数

javascript - PHP 和 JQuery 添加动态输入

java - 如何将多个json网址的内容添加到单个json对象中

python - 为 Ising-/Potts-Model Monte-Carlo 加速 Python/Numpy 代码

python - 使用 lxml 处理 XML 文档中类似实体的最佳方法是什么?

Python 正则表达式捕获组拆分问题

python - Pandas 访问最后一个非空值

python - 具有非线性趋势的去趋势通量时间序列