Python 使用NumPy填充图像会返回全部黑色
我使用NumPy创建了一个新的2D数组,其中边框为0,内部为原始图像的数组。我打印新阵列,这是我所期望的。但是当我画它的时候,它全是黑色的 我试过用loop和NumPy,没用Python 使用NumPy填充图像会返回全部黑色,python,numpy,opencv,image-processing,Python,Numpy,Opencv,Image Processing,我使用NumPy创建了一个新的2D数组,其中边框为0,内部为原始图像的数组。我打印新阵列,这是我所期望的。但是当我画它的时候,它全是黑色的 我试过用loop和NumPy,没用 import cv2 import numpy as np path = 'test.jpg' img = cv2.imread(path,0) print(img) height,width = img.shape # 440 * 455 new_arr = np.zeros((height+2,wid
import cv2
import numpy as np
path = 'test.jpg'
img = cv2.imread(path,0)
print(img)
height,width = img.shape # 440 * 455
new_arr = np.zeros((height+2,width+2), dtype = int)
#for i in range(height):
# for j in range(width):
# new_arr[i+1][j+1] = img[i][j]
new_arr[1:height+1,1:width+1] = img
print(new_arr)
cv2.imshow('new image',new_arr)
cv2.waitKey(0)
cv2.destroyAllWindows()
原始图像如下:
我希望图像具有黑色边框(仅1像素),内部是原始图像以进行中值滤波,但实际输出是黑色图像。不确定如何获得黑色图像,因为您的代码可能会抛出错误。您需要在适当的命名空间(
np.
)中设置dtype
值,该值应为uint8
:
import cv2
import numpy as np
path = 'test.png'
img = cv2.imread(path,0)
height,width = img.shape
new_arr = np.zeros((height+2,width+2), dtype = np.uint8)
new_arr[1:height+1,1:width+1] = img
print(new_arr)
cv2.imshow('new image',new_arr)
cv2.waitKey(0)
cv2.destroyAllWindows()
请注意您提供的图像是png
,而不是jpg
。在该图像上测试的代码
不确定您是如何得到黑色图像的,因为您的代码应该抛出一个错误。您需要在适当的命名空间(
np.
)中设置dtype
值,该值应为uint8
:
import cv2
import numpy as np
path = 'test.png'
img = cv2.imread(path,0)
height,width = img.shape
new_arr = np.zeros((height+2,width+2), dtype = np.uint8)
new_arr[1:height+1,1:width+1] = img
print(new_arr)
cv2.imshow('new image',new_arr)
cv2.waitKey(0)
cv2.destroyAllWindows()
请注意您提供的图像是png
,而不是jpg
。在该图像上测试的代码
尝试使用
np.zero((…),dtype=uint8)
@Cris无法工作,错误namespace@FlashThunder:它很接近,指向问题所在。我发布了一条评论而不是答案,因为我知道语法可能不准确。请尝试使用np.zeros((…),dtype=uint8)
@Cris不起作用,错了namespace@FlashThunder:它很接近,指向问题所在。我只是发表评论而不是回答,因为我知道语法可能不准确。OpenCVMat
class支持带符号的32位整数,这样的数组可以使用cv::imshow
显示。这可以通过文档进行验证,并使用cv2.imshow(“”,np.zeros((100100),dtype=np.int32))进行测试;cv2.waitKey()
。这并不是说int
在这里是一个合适的选择,但是你文章的第一句话是不正确的。编辑了我的答案,+1用于注释,在这种情况下仍然是int32将不起作用。OpenCVMat
class支持带符号的32位整数,并且可以使用cv::imshow
显示这样的数组。这可以通过文档进行验证,并使用cv2.imshow(“”,np.zeros((100100),dtype=np.int32))进行测试;cv2.waitKey()
。这并不是说int
在这里是一个合适的选择,但是你文章的第一句话是不正确的。编辑了我的答案,+1用于评论,在这种情况下仍然是int32将不起作用。