2017-10-04 47 views
2

我有一個大的圖像,使用CV2模塊在Python和一些座標I剪切的圖像:蟒,OpenCV的,圖像陣列以二進制

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

可以使用[io.BytesIO](https://docs.python.org/3/library /io.html#io.BytesIO)將數據保存到RAM中的假文件。 –

+0

爲什麼你需要寫入一個文件? – noel

+0

當你說'二進制',你的意思是二進制字符串或數字或別的東西? – Divakar

回答

0

發現這個線程的答案: Python OpenCV convert image to byte string?

將通過numpy的數組轉換爲字符串表示的圖像可以通過CV2

>>> img_str = cv.imencode('.jpg', img)[1].tostring() 
>>> type(img_str) 
'str' 
1

如果使用使用imencode和toString函數來完成cv2.imwrite(),那麼您將獲得圖像格式的圖像,例如png, jpg, bmp等。現在如果您open(xxx,"rb")作爲一個正常的二進制文件,它會出錯,因爲它是AN IMAGE in IMAGE FILE FORMAT

最簡單的方法是使用np.save()np.ndarray以.npy格式保存到磁盤(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() 

其結果是:

enter image description here