2017-10-04 6 views
2

Ich habe ein großes Bild, CV2 Modul in Python und einige Koordinaten i, das Bild beschnitten:Python, opencv, Bildarray auf binäre

img = cv.imread(image_path) 
    crop_img = img[y1:y2,x1:x2] 
    cv.imwrite(cropPath, crop_img) 

nun der crop_img ist ein numpy.ndarray Typ. Ich speichere dann dieses Bild auf der Festplatte und ihr Inhalt in einem binären Format lesen unter Verwendung eines open() Funktion

with open(cropPath, 'rb') as image_file: 
    content = image_file.read() 

und ich erhalte die binäre Darstellung. Gibt es eine Möglichkeit, die obigen Vorgänge auszuführen, ohne das Image auf der Festplatte zu speichern. Das Speichern auf der Festplatte spart viel Zeit, ich kann keine Methode dafür finden. Wenn jemand in die richtige Richtung zeigen könnte, wäre das hilfreich.

+0

Sie können ein Verwenden Sie [io.BytesIO] (https://docs.python.org/3/library /io.html#io.BytesIO), um die Daten in einer falschen Datei im RAM zu speichern. –

+0

Warum müssen Sie in eine Datei schreiben? – noel

+0

Wenn du 'binary' sagst, meinst du Binärstring oder Zahlen oder etwas anderes? – Divakar

Antwort

0

fand die Antwort auf diesen Thread: Python OpenCV convert image to byte string?

ein Bild dargestellt durch eine numpy Array in String-Umwandlung kann durch die Verwendung imencode und tostring Funktionen in cv2

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

erfolgen Wenn Sie cv2.imwrite(), dann erhalten Sie ein Bild im Bildformat, z. B. png, jpg, bmp und so weiter. Jetzt, wenn Sie open(xxx,"rb") als eine normale Binärdatei, wird es falsch gehen, weil es AN IMAGE in IMAGE FILE FORMAT ist.

Der einfachste Weg ist die Verwendung np.save(), um die np.ndarray auf die Festplatte (serialize) im .npy-Format zu speichern. Die Verwendung np.load() von der Festplatte laden (deserialize).

Eine Alternative ist pickle.dump()/pickle.load(). Hier

ein Beispiel:

#!/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() 

Das Ergebnis:

enter image description here