目录:
- caffe与cv2图片格式转换
- str 与cv2图片格式转换
- pil 与cv2图片格式转换
- str 与 pil图片格式转换
caffe与cv2图片格式的转换
python中两种方式直接获得的图像是不一样的,主要表现在颜色通道,数据类型上,如下表。因此同时使用caffe和cv2时,需要将数据进行转换。
颜色通道 | 数据类型 | |
caffe | RGB | np.float32 |
cv2 | BGR | np.uint8 |
- caffe加载的图片转换为cv2可用的图片
>>> import cv2,caffe
>>> import numpy as np
>>> img_path='test_folder/1.jpg'
>>> img_caffe=caffe.io.load_image(img_path)
>>> img_caffe.dtype
dtype('float32')
>>> img_caffe*=255
>>> img_caffe_cvt=img_caffe.astype('uint8')
>>> img_caffe2cv=img_caffe_cvt[:,:,[2,1,0]] #颜色通道转换
>>> img_caffe2cv2=cv2.cvtColor(img_caffe_cvt, cv2.COLOR_RGB2BGR) #利用opencv函数转换
>>> img_cv=cv2.imread(img_path) #验证
>>> img_cv.dtype
dtype('uint8')
>>> img_sub=img_caffe2cv-img_cv
>>> img_sub2=img_caffe2cv2-img_cv
>>> np.max(img_sub)
0
>>> np.max(img_sub2)
0
- cv2加载的图片转换为caffe加载图片后的结果
>>> import cv2,caffe
>>> import numpy as np
>>> img_path='test_folder/1.jpg'
>>> img_cv=cv2.imread(img_path)
>>> img_cv=img_cv/255.
>>> img_cv_cvt=img_cv.astype('float32')
>>> img_cv2caffe=cv2.cvtColor(img_cv_cvt, cv2.COLOR_BGR2RGB) #img_cv2caffe=img_cv_cvt[:,:,[2,1,0]]
>>> img_caffe=caffe.io.load_image(img_path)
>>> img_sub=img_caffe-img_cv2caffe
>>> np.max(img_sub)
0.0
相关问题:
图片由caffe转换为cv2格式时,若进一步对该图片进行操作(如cv2.rectangle,但cv2.imwrite可用),会出现如下数据类型错误。
TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
解决方法是将该数据进行复制。查阅网上其他解决方法,有说numpy版本问题,可是测试中使用的numpy已经是当时最新的,先mark下该问题。
>>> img_rst=cv2.rectangle(img_caffe2cv, (1,2),(4,5),(0,255,0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)
>>> np.__version__
'1.14.1'
>>> img_caffe2cv_cp=img_caffe2cv.copy()
>>> img_rst=cv2.rectangle(img_caffe2cv_cp, (1,2),(4,5),(0,255,0))
str_to_cv2的转换
>>> import cv2
>>> import numpy as np
>>> img_path='/data1/cv_group/cv_user/data/0--11.jpg'
>>> img_buff=open(img_path, 'rb').read()
>>> img_np=np.asarray(bytearray(img_buff), np.uint8)
>>> img_tocv=cv2.imdecode(img_np, cv2.IMREAD_UNCHANGED)
>>> img_tocv.shape #bgra四通道
(350, 512, 4)
>>> type(img_buff)
<type 'str'>
>>> img_np.shape
(241155,)
>>> img_cv=cv2.imread(img_path, 1) #验证转换结果
>>> img_tocvbgr=img_tocv[:,:,0:3]
>>> img_tocvbgr.shape
(350, 512, 3)
>>> img_cv.shape
(350, 512, 3)
>>> img_sub=img_tocvbgr-img_cv
>>> np.max(img_sub)
0
cv2_to_str的转换
import cv2
import base64
img_path = '1.jpg'
img_cv = cv2.imread(img_path)
flag_end, img_jpg = cv2.imencode('.jpg', img_cv)
assert(flag_end == True), 'encode must be true'
data = {}
data["image_base64"] = base64.b64encode(img_jpg.tostring())
pil与cv2图片格式的转换
import cv2
import numpy as np
from PIL import Image
img_path = 'C:\\Users\\Administrator\\Desktop\\1.jpg'
img_pil = Image.open(img_path)
img_pil2cv = cv2.cvtColor(np.asarray(img_pil),cv2.COLOR_RGB2BGR) #pil to cv2
img_cv2pil = Image.fromarray(cv2.cvtColor(img_pil2cv,cv2.COLOR_BGR2RGB)) #cv2 to pil
img_cv2pil.show()
cv2.imshow('cv', img_pil2cv)
cv2.waitKey(0)
from keras.preprocessing import image
img = image.load_img(img_path, target_size=(224, 224)) #<class 'PIL.Image.Image'>
x = image.img_to_array(img) # <type 'numpy.ndarray'>
str与pil图片格式的转换
from PIL import Image
from io import BytesIO
img_path='1.jpg'
buffs = open(img_path, 'rb').read()
img_pil = Image.open(BytesIO(buffs))
img_pil.save('1_bnk.jpg')
注意:python-opencv 版本不同时,cv2.imdecode的参数可能为:cv2.CV_LOAD_IMAGE_UNCHANGED或cv2.IMREAD_UNCHANGED。