数字图像与机器视觉基础
一.比较不同位深度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