图像分析-图片格式

在开始学习图像处理的时候,我们一般都需要从网络上找到合适的学习图片范例,但是网络图片下载后往往不一定是我们需要的图片格式。可以使用格式工厂对图片进行格式转化。我推荐使用编程技术来实现格式转化,用起来要比工具方便(不用安装)。

图片存储

计算机中存储的图片大致分为两种:位图和矢量图;

位图

又名点阵图像和栅格图像,是由称作像素(图片元素)的单个点组成的。这类图像放大后会变模糊,甚至出现格子(栅格)矩阵。日常手机、单反等摄影设备产出的都是这类图像。

矢量图

也称为面向对象的图像或绘图图像,在数学上定义为一系列由点连接的线。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。

位图格式

位图是当下图像处理的重点,相比矢量图缺少对象识别、对象位置标定、对象类型判定与还原等。我们图像分析就是为了从位图中识别感兴趣的对象信息。

BPM

没有压缩像素格式。支持四种颜色模式。
单色: 一个像素只占一位,要么是0,要么是1,所以只能存储黑白信息
16色位图: 一个像素4位,有16种颜色可选
256色位图: 一个像素8位,有256种颜色可选
24位位图: 就是图(1)所示的位图,颜色可有2^24种可选,对于人眼来说完全足够了。

JPEG

jpeg是有损压缩格式, 将像素信息用jpeg保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在[0,100]之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择70或80就足够了。
jpeg没有透明信息。
jpeg比较适合用来存储相机拍出来的照片,这类图像用jpeg压缩后的体积比较小。其使用的具体算法核心是离散余弦变换、Huffman编码、算术编码等技术.
jpeg格式支持不完全读取整张图片,即可以选择读取原图、1/2、1/4、1/8大小的图片

PNG

png是一种无损压缩格式, 压缩大概是用行程编码算法。
png可以有透明效果。
png比较适合适量图,几何图。 比如本文中出现的这些图都是用png保存,比用joeg保存体积要小。
再强调一下: jpeg比较适合存储色彩“杂乱”的拍摄图片,png比较适合存储几何特征强的图形类图片。
有24位图和32位图之分。32位图就是带有alpha通道的图片。
将图片a绘制到另一幅图片b上,如果图片a没有alpha通道,那么就会完全将b图片的像素给替换掉。而如果有alpha通道,那么最后覆盖的结果值将是c = aalpha + b(1-alpha)
再对LBitmap添加png的支持。

GIF

动图格式,上面提到的bmp,jpeg,png图片都只有一帧,而gif可以保存多帧图像。

webp

google开发的一种有损、透明图片格式,相当于jpeg和png的合体,google声称其可以把图片大小减少40%。

格式转换-python

依赖库-PIL

pip install pillow

webp转JPEG

def getJPGFromWebbp(url, filePath):
    res = requests.get(url)
    byte_stream = io.BytesIO(res.content)
    # Image打开二进制流Byte字节流数据
    roiImg = Image.open(byte_stream)
    # 转成jpeg
    roiImg = roiImg.convert('RGB')
    roiImg.save(filePath, quality=95)

webp转png

def getPngFromWebdp(url, filePath):
    res = requests.get(url)
    # 把请求到的数据转换为Bytes字节流
    byte_stream = io.BytesIO(res.content)
    # Image打开二进制流Byte字节流数据
    roiImg = Image.open(byte_stream)
    imgByteArr = io.BytesIO()
    roiImg.save(imgByteArr, format='PNG')
    imgByteArr = imgByteArr.getvalue()
    with open(filePath, "wb") as f:
        f.write(imgByteArr)

JPEG转PNG

def getJpegFromPng(source, target):
    roiImg = Image.open(source)
    roiImg = roiImg.convert('RGB')
    roiImg.save(target, quality=95)

PNG转JPEG

def getPngFromJpeg(source, target):
    roiImg = Image.open(source)
    imgByteArr = io.BytesIO()
    roiImg.save(imgByteArr, format='PNG')
    imgByteArr = imgByteArr.getvalue()
    with open(target, "wb") as f:
        f.write(imgByteArr)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值