数字图像与机器视觉基础

一.比较不同位深度BMP文件

从网页上下载一张彩色图片,查看该图片信息,显示位深度24:
在这里插入图片描述
以该图片为例,将其用画图工具转换为256色、16色、单色的位图(BMP)文件,并比较大小:
在这里插入图片描述
将该图片转换为.jpg、.png、.bmp、.gif,并比较大小:
在这里插入图片描述

在这里插入图片描述
使用UltraEdit打开图片,查看文件头信息:
huoying.bmp:
在这里插入图片描述
huoying-16:
在这里插入图片描述
huoying-24:
在这里插入图片描述
huoying-256:

在这里插入图片描述
huoying-danse:
在这里插入图片描述

位图文件头分4部分,共14字节:

bfType:2字节,作为标识,就是“BM”二字。
bfSize:4字节,整个BMP文件的大小。
bfReserved1/2:4字节,保留字,没用。
bfOffBits:4字节,偏移数,即 位图文件头+位图信息头+调色板 的大小。
在这里插入图片描述

作为真彩色位图,我们主要关心的是biWidth和biHeight这两个数值,两个数值告诉我们图像的尺寸。biSize,biPlanes,biBitCount这几个数值是固定的。想偷懒的话,其它的数值可以一律用0来填充。
原图PNG大小为1,770,116 字节

BMP大小:1,966,134字节,压缩比:-110%

JPG大小:114,846字节,压缩比:64%

GIF大小:369,122字节,压缩比:20%

二.用奇异只分解对图片进行降维处理

代码如下:

import numpy as np
import os
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib as mpl
from pprint import pprint


def restore1(sigma, u, v, K):  # 奇异值、左特征向量、右特征向量
    m = len(u)
    n = len(v[0])
    a = np.zeros((m, n))
    for k in range(K):
        uk = u[:, k].reshape(m, 1)
        vk = v[k].reshape(1, n)
        a += sigma[k] * np.dot(uk, vk)
    a[a < 0] = 0
    a[a > 255] = 255
    # a = a.clip(0, 255)
    return np.rint(a).astype('uint8')


def restore2(sigma, u, v, K):  # 奇异值、左特征向量、右特征向量
    m = len(u)
    n = len(v[0])
    a = np.zeros((m, n))
    for k in range(K+1):
        for i in range(m):
            a[i] += sigma[k] * u[i][k] * v[k]
    a[a < 0] = 0
    a[a > 255] = 255
    return np.rint(a).astype('uint8')


if __name__ == "__main__":
    A = Image.open("./lena.jpg", 'r')
    print(A)
    output_path = r'./SVD_Output
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值