caffe与cv2图片格式的相互转换

目录:    

  1.     caffe与cv2图片格式转换
  2.     str    与cv2图片格式转换
  3.     pil     与cv2图片格式转换
  4.     str   与 pil图片格式转换

caffe与cv2图片格式的转换

    python中两种方式直接获得的图像是不一样的,主要表现在颜色通道,数据类型上,如下表。因此同时使用caffe和cv2时,需要将数据进行转换。

 颜色通道数据类型
caffeRGBnp.float32
cv2BGRnp.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。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值