matlab 定义uint8矩阵,记录Python和Matlab的uint8的区别

python和matlab都可以读取的图片,图片的数字类型也可以跟着改变。 比如如果读了一张hdr的图片,图片矩阵的数字一定的float的。但是如果把这张图片做色调映射(tone mapping)变成ldr图片再保存成.jpg格式的话,图片的数字类型必须变到[0,255]的整数。之前我在做灰度图到彩色图的转换的时候发现,同一张图片用matlab和python写成.jpg保存,结果是不一样的。如果图片名是img的话:

matlab中我用的%matalb

uint8(img)

imwrite(img, '123.jpg')

python用的#python

img.astype('uint8‘)

imageio.imwrite(img, '123.jpg')

这里matlab保存的图像很好,但是python的结果会出问题。如果不用astype的话,写下的图片会发暗。原因是原图的动态范围比较大,超过了8bit的范围。要想存入.jpg格式就必须对动态范围进行压缩。为了把凉的变暗,那么暗的地方自然就更暗了。

如果用astype('uint8')的话,在图片一些区域会有集中的大片的单一颜色,好像被油漆刷过一样。这里我知道的原因是astype的机制是casting的格式转换,所以四舍五入会导致图片的颜色改变。具体为什么出现大片的单一色目前还不清楚。

而matlab的uint8()方程是直接切掉多出去的值。比如说有个2x2矩阵m=[-1,5,3000,200]。uint8(m)之后结果是[0, 5, 255, 200]。也就是说在[0, 255]之间的数字不动,只把大于255的变成255,把小于0的变成0就好了。

如果在python里想达到同样的切除多余值的效果也很简单:m[m>255] = 255

m[m<0] = 0

如果图片或者矩阵很大的话建议用numpy.clip,速度会快一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值