(5) caffe.io.load_image()和cv2.imread()读图像的差别

本文探讨了使用cv2.imread(), caffe.io.load_image()及PIL读取图像的不同,并详细说明了不同读取方法对图像预处理的影响,包括格式转换、缩放及均值减法等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cv2.imread()

如果用cv2.imread()接口读图像,读进来直接是BGR 格式and 0~255
所以不需要再缩放到【0,255】和通道变换【2,1,0】,不需要transformer.set_raw_scale(‘data’,255)和transformer.set_channel_swap(‘data’,(2,1,0)

caffe.io.load_image()

若是caffe.io.load_image()读进来是RGB格式和0~1(float)
所以在进行特征提取之前要在transformer中设置transformer.set_raw_scale(‘data’,255)(缩放至0~255)
以及transformer.set_channel_swap(‘data’,(2,1,0)(将RGB变换到BGR)

使用PIL来读取图片

对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。所以需要转换格式,但不需要缩放到[0,255]

data = np.array(Image.open(self.dataRoot+img_list))
data = np.transpose(data,(2,0,1))
data[[0,2],...] = data[[2,0],...] #RGB→BGR

调用caffe model进行特征提取 ,分类。要注意区分image用何种方法读进来。

Demo

#new model
    self.model_def = self.QSPath + '/SRC/model/NewModel/deploy.prototxt'
    self.model_weights = self.QSPath + '/SRC/model/NewModel/_iter_115000.caffemodel'
    self.mean_file= self.QSPath + '/SRC/model/NewModel/mean.npy'
# net
    net = caffe.Net(self.model_def,self.model_weights,caffe.TEST)

#transformer      
    transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
    transformer.set_transpose('data', (2,0,1)) #图片的默认格式是(weight,height,channel),修改为(channel,weight,height)
    transformer.set_mean('data', np.load(self.mean_file).mean(1).mean(1)) # mean ixel 
    # transformer.set_raw_scale('data', 255)# from [0,1] to [0,255]
    # transformer.set_channel_swap('data', (2,1,0)) 
    net.blobs['data'].reshape(1,3,size,size)

    return net, transformer

使用skimage.io.imread可能存在的问题

caffeio.load_image()返回值为0到1之间的浮点数,也就是在内部已经除以了255,如果不设定,返回值的图像也是RGB三个通道的图像,可以在参数中加一个False这个参数,返回就是灰度图像来。
skimage.io.imread得到的是uint8的数据,而caffe.io.load_image得到的是0-1之间的小数。

img=skimage.io.imread(img_path), uint8,0-255
img=caffe.io.load_image(img_path), float,0-1

这个还不是最关键的,关键是在使用时的实际情况。

caffe里,使用caffe.io.load_image时,需要把值转换为0-255之间,所以要乘255.

img=skimage.io.imread(img_path),uint8,0-255
img=caffe.io.load_image(img_path)*255,float,0-255

然后最关键的平方,在DL中,要减去均值才行是吧,于是

img=skimage.io.imread(img_path)-mean,uint8,0-255
img=caffe.io.load_image(img_path)*255-mean,float,0-255

此时看似没什么问题。但是第一种方式,减掉均值后,很多地方变成0了。这个在对整图操作时,可能影响还不大,但是如果你要考虑局部的信息,比如像素点的局部信息,此时你就等着吧,绝对因为大部分是0,什么都没有了。

而第二种情况,因为是浮点数,减均值后还是有值的,在0附近的小数,于是这个还是比较正常的输入值,对DL来说,当你定位到局部信息时,还是比较真实的。

于是,我是这么做的,把第一种情况得到的图像都乘以1.0,然后就看到图像的像素值变成浮点型了。这样以来,在减均值时,就好了。

img=(skimage.io.imread(img_path))*1.0,uint8,0-255
img=caffe.io.load_image(img_path)*255,float,0-255

罗嗦那么多,其实有一种直接的办法,如果均值是浮点型的,不要四舍五入,即使不作转换,第一种情况也不会是大部分0了,看来在python里也是遵守类型转换往高一级的类型靠拢的原则啊。

原文链接

  1. 关于特征提取时用cv2.imread()和caffe.io.load_image()读图像的差别
  2. pycaffe做识别时通道转换问题
  3. 【Caffe使用足迹】caffe.io.load_image()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值