我有一个大图像,使用python中的cv2模块和一些坐标我裁剪图像:
img = cv.imread(image_path)
crop_img = img[y1:y2,x1:x2]
cv.imwrite(cropPath, crop_img)
现在crop_img是一个numpy.ndarray类型。然后我将此图像保存到磁盘并使用open()函数
以二进制格式读取其内容 with open(cropPath, 'rb') as image_file:
content = image_file.read()
我得到二进制表示。 有没有办法在不将图像保存到磁盘的情况下执行上述操作。不保存到磁盘将节省大量时间,我无法找到任何方法来执行此操作。如果有人能指出正确的方向,那将会有所帮助。
答案 0 :(得分:3)
在这个帖子上找到了答案: Python OpenCV convert image to byte string?
将通过numpy数组表示的图像转换为字符串可以通过在cv2中使用imencode和tostring函数来完成
>>> img_str = cv.imencode('.jpg', img)[1].tostring()
>>> type(img_str)
'str'
答案 1 :(得分:1)
如果您使用cv2.imwrite()
,则会获得图片格式的图片,例如png, jpg, bmp
等。现在,如果您open(xxx,"rb")
作为普通二进制文件,则会出错,因为它是AN IMAGE in IMAGE FILE FORMAT
。
最简单的方法是使用np.save()
以.npy格式将np.ndarray
保存到磁盘(serialize
)。使用np.load()
从磁盘加载(deserialize
)。
另一种选择是pickle.dump()/pickle.load()
。
以下是一个例子:
#!/usr/bin/python3
# 2017.10.04 21:39:35 CST
import pickle
imgname = "Pictures/cat.jpg"
## use cv2.imread()/cv2.imwrite()
img = cv2.imread(imgname)
## use np.save() / np.load()
np.save(open("another_cat1.npy","wb+"), img)
cat1 = np.load(open("another_cat1.npy","rb"))
## use pickle.dump() / pickle.load()
pickle.dump(img, open("another_cat2.npy","wb+"))
cat2 = pickle.load(open("another_cat2.npy", "rb"))
cv2.imshow("img", img);
cv2.imshow("cat1", cat1);
cv2.imshow("cat2", cat2);
cv2.waitKey();cv2.destroyAllWindows()
结果: