PIL和cv2读取图片时的差异及round函数讲解

本文介绍了PIL和OpenCV在读取图像时的差异,PIL图像数据范围在0~1之间,OpenCV在0~255,并分别说明了它们的通道格式。此外,详细阐述了round()函数的四舍五入规则,以及在处理浮点数四舍五入问题时可能遇到的二进制精度问题和解决方案。

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

torchvision的tranform中,读取图像采用PIL图像,而一般情况下我们都是用cv2,这里介绍下两者的区别,

PIL读取图片scale为(0~1),读取为RGB格式,对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。

data = np.array(Image.open(img_path)) 
data = np.transpose(data,(2,0,1))#转换通道 

caffe.io.load_image()读取图片scale为(0~1),读取为RGB格式,通道格式为(H,W,C)

cv2.imread()读取图像scale为(0~255),读取为BGR 格式,通道格式为(H,W,C),即行,列、通道数(Row, Col, C)。

round( )函数简介

round() 函数作用就是,返回浮点数x的四舍五入值。

round( x [, n] )

参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。

>>> round(2.3)

2

>>> round(2.45, 1)

2.5

>>> round(2.675, 2)

2.67

round()函数只有一个参数,不指定位数的时候,返回一个整数,而且是最靠近的整数,类似于四舍五入,当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的情况时,如果要取舍的位数前的小数是奇数,则直接舍弃,如果是偶数则向上取舍。根据取舍的位数前的小数奇偶性来判断,奇偶平分,符合公平性原则。

为什么需要平分呢?原因就是部分小数无法用二进制完整表示,如1.15,转为二进制将是很长的一串数字:1.0010011001100110011001100110011001100110011001100110011 这可不是简单的几个字节就能存放下的。因此这里就出现了取舍的问题。

那么正确的四舍五入是否无法实现了呢?当然是有解决办法的。比如,当你需要四舍五入保留两位小数的时候,可以将数值乘以100再除以100.0:

>>> round(2.675 * 100)/100.0

2.68

这样可以解决部分浮点数四舍五入的问题。为什么是部分呢?笔者发现:

>>> round(2.135*100)/100.0

2.13

检验下过程:

>>> 2.135*100

213.49999999999997

>>> Decimal(2.135)*100

Decimal('213.4999999999999786837179272')

由于二进制导致这个结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值