数字图像与机器视觉基础补充(1)

本文介绍了数字图像的格式转换,包括用Photoshop将彩色图像保存为不同位数的BMP文件,分析了BMP文件结构,并比较了BMP、JPG、GIF和PNG的文件大小和压缩比率。此外,还探讨了图像处理编程中的奇异值分解和图像开闭运算在检测硬币、细胞及条形码定位中的应用。
摘要由CSDN通过智能技术生成

一、图像格式转换

1.用图像编辑软件打开一个彩色图像文件,将其分别保存为 32位、16位彩色和256色、16色、单色的位图(BMP)文件

①保存为32位、16位彩色位图(BMP)文件
使用PhotoShop打开一张图片,点击文件->存储为:
在这里插入图片描述

选择BMP格式,点击保存后会弹出一个选择框,可以选择保存的位数:
在这里插入图片描述

在这里插入图片描述

结果:
16位:
在这里插入图片描述

32位:
在这里插入图片描述

肉眼看没什么区别。

②256色、16色、单色的位图(BMP)文件
使用电脑自带的画图工具即可。
用画图打开图片,点击文件,选择另存为->BMP图片在这里插入图片描述

分别存为单色、16色、256色:
在这里插入图片描述

单色:
在这里插入图片描述

16色:
在这里插入图片描述

256色:
在这里插入图片描述

2.分析图片

BMP文件结构
BMP文件由4部分组成:

  1. 位图文件头(bitmap-file header)

  2. 位图信息头(bitmap-informationheader)

  3. 颜色表(color table)

  4. 颜色点阵数据(bits data)

24位真彩色位图没有颜色表,所以只有1、2、4这三部分。


看图像属性,位深度,如果是24,就说明图片是24位真彩色
在这里插入图片描述


用UltraEdit打开一张BMP的图片(以16位彩色为例),可以看到这个文件的数据如下图所示:
在这里插入图片描述

2.1位图文件头(BITMAPFILEHEADER)

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

名称 占用空间 内容 实际数据
bfType 2字节 标识,就是“BM”二字 BM
bfSize 4字节 整个BMP文件的大小 0x00080038(524,344)【与右键查看图片属性里面的大小值一样】

在这里插入图片描述

名称 占用空间 内容 实际数据
bfReserved1/2 4字节 保留字,没用 0
bfOffBits 4字节 偏移数,即 位图文件头+位图信息头+调色板 的大小 0x36(54)

在这里插入图片描述

注意,Windows的数据是倒着念的,这是PC电脑的特色。如果一段数据为50 1A 25 3C,倒着念就是3C 25 1A50,即0x3C251A50。因此,如果bfSize的数据为38 00 08 00,实际上就成了0x00080038,也就是0x80038。

2.2位图信息头(BITMAPINFOHEADER )
位图信息头共40字节:

名称 占用空间 内容 实际数据
biSize 4字节 位图信息头的大小,为40 0x28(40)
biWidth 4字节 位图的宽度,单位是像素 0x200(512)
biHeight 4字节 位图的高度,单位是像素 0x200(512)
biPlanes 2字节 固定值1 1
biBitCount 2字节 每个像素的位数1-黑白图,4-16色,8-256色,24-真彩色) 0x10(16)
biCompression 4字节 压缩方式,BI_RGB(0)为不压缩 0
biSizeImage 4字节 位图全部像素占用的字节数,BI_RGB时可设为0 0x080002(524290)
biXPelsPerMeter 4字节 水平分辨率(像素/米) 0x0B39(2873)
biYPelsPerMeter 4字节 垂直分辨率(像素/米) 0x0B39(2873)
biClrUsed 4字节 位图使用的颜色数 如果为0,则颜色数为2的biBitCount次方 0
biClrImportant 4字节 重要的颜色数,0代表所有颜色都重要 0

在这里插入图片描述

作为真彩色位图,我们主要关心的是biWidth和biHeight这两个数值,两个数值告诉我们图像的尺寸。biSize,biPlanes,biBitCount这几个数值是固定的。

2.3调色板
位图是16位、24位和32位色,则图像文件中不保留调色板,即不存在调色板,图像的颜色直接在位图数据中给出。 16位图像使用2字节保存颜色值,常见有两种格式:5位红5位绿5位蓝和5位红6位绿5位蓝,即555格式和565格式。
1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据,即调色板最多只需要256项(索引0 - 255)。
颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号1的颜色,接下来表示颜色号2的颜色,依此类推。

2.4颜色点阵数据
颜色表接下来位为位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度图像高度记录像素的位数)/8。

2.5 该16位位图大小计算方法:位图文件头(14字节00000000h开始到0000000Dh)+位图信息头(40字节0000000Eh开始到00000035h)+实际像素点占内存(512×512×2字节)=524342字节(Byte)。与真实值相差2个字节,将UltraEdit文件翻到末尾,可以看到有两个为0字节,前面的都是位图图像数据,所以该文件的大小应该在刚才算出来的基础上+2=524344字节,与真实值一致:
在这里插入图片描述
3.其余图片信息
32位彩色:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以看到除了 文件头除了bfSize都是相同的:bfSize=0x100038=1048432正好是该图的大小。
256色的位图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
16色:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

单色:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.将彩色照片分别保存为BMP、JPG、GIF和PNG格式,对比它们的文件大小比,判断图像的压缩保存后的压缩比率。

使用PS随便画了一张图,分别保存为BMP(24位)
在这里插入图片描述

使用画图转换为其他格式
文件大小:
BMP:1.19M
JPG:39.6k
GIF:30.7k
PNG:36k
图像的压缩保存后的压缩比率(由于BMP是不压缩的,所以以它为基准):
JPG:96.8%
GIF:97.5%
PNG:97.1%

二、图像处理编程

1、奇异值分解(SVD)

代码:

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'
    if not os.path.exists(output_path):
        os.mkdir(output_path)
    a = np.array(A)
    print(a.shape)
    K = 50
    u_r, sigma_r, v_r = np.linalg.svd(a[:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值