I have a large image , using cv2 module in python and some coordinates i cropped the image:
img = cv.imread(image_path)
crop_img = img[y1:y2,x1:x2]
cv.imwrite(cropPath, crop_img)
now the crop_img is a numpy.ndarray type. then I save this image to disk and read its contents in a binary format using an open() function
with open(cropPath, 'rb') as image_file:
content = image_file.read()
and I get the binary representation. Is there any way to do the above operations without saving the image to disk. Not saving to disk will save a lot of time, I am not able to find any method to do this. if anyone could point in the right direction, that would be helpful.
found the answer on this thread: Python OpenCV convert image to byte string?
converting a image represented through a numpy array into string can be done by using imencode and tostring functions in cv2
>>> img_str = cv.imencode('.jpg', img)[1].tostring()
>>> type(img_str)
'str'
If you use cv2.imwrite(), then you will get an image in image format,such as png, jpg, bmp and so on. Now if you open(xxx,"rb") as a normal binary file, it will go wrong, because it is AN IMAGE in IMAGE FILE FORMAT.
The simplest way is use np.save() to save the np.ndarray to the disk (serialize) in .npy format. The use np.load() to load from disk (deserialize).
An alternative is pickle.dump()/pickle.load().
Here is an example:
#!/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()
The result:

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With