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

这篇博客介绍了数字图像的基础知识,包括BMP图片的位图转换、文件头计算和大小分析。此外,还涉及图像处理编程任务,如使用奇异值分解(SVD)进行特征提取,以及通过开闭运算检测图像中的对象,如硬币和细胞。最后提到了条形码的定位和字符提取。
摘要由CSDN通过智能技术生成

一.实践操作

1.bmp图片不同位图

打开一个彩色图像文件,将其分别保存为 32位、16位彩色和256色、16色、单色的位图(BMP)文件,对比其文件大小,并计算分析这些图片在内存中的存储容量是多少?当保存为BMP文件时,将用文件头来记录图像的属性,
在这里插入图片描述

2.用notepad打开

ren1.bmp:
在这里插入图片描述
ren16.bmp:
在这里插入图片描述
ren256.bmp:
在这里插入图片描述

3.位图大小计算

位图大小计算公式为;长×高×位深度
在这里插入图片描述
512* 512 *1 / 8 / 1024=32 (kb)

4.头文件的大小计算:

0~1 两个字节为文件类型,0x4d42为固定BM
2~5 四个字节为文件大小,0x184e,即6222
6~9 四个字节为保留字段,全0
a~d 四个字节为从文件头到实际的位图数据的偏移字节数
12~15 四个字节表示图片宽度,0xdc为220
16~19 四个字节表示图片高度,0xdc为220
1a~1b 两个字节,恒定为0x1
1c~1d 两个字节表示像素占的比特,这里为0x1即两种颜色,16色为0x4即16种颜色,256色为0x8即256种颜色
1e~21 四个字节表示图片是否压缩,0x0表示不压缩
22~25 四个表示图像大小,0x1810为6160
26~29 四个字节表示水平分辨率
2a~2d 四个字节表示垂直分辨率
23~31 四个字节表示实际使用的颜色索引数
32~35 四个字节表示重要的颜色索引数

可以发现文件头一共占40个字节,为十六进制。

二.根据提供的资料完成以下图像处理编程任务

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("E:/人工智能与机器学习/数字图像与机器视觉作业/人脸不同位图(BMP)文件/ren.jpg", 'r')
    print(A)
    output_path = r'E:/人工智能与机器学习/数字图像与机器视觉作业/人脸不同位图(BMP)文件/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[:, :, 0])
    u_g, sigma_g, v_g = np.linalg.svd(a[:, :, 1])
    u_b, sigma_b, v_b = np.linalg.svd(a[:, :, 2])
    plt.figure(figsize=(11, 9), facecolor='w')
    mpl.rcParams['font.sans-serif'] = ['simHei']
    mpl.rcParams['axes.unicode_minus'] = False
    for k in range(1, K+1):
        print(k)
        R = restore1(sigma_r, u_r, v_r, k)
        G = restore1(sigma_g, u_g, v_g, k)
        B = restore1(sigma_b, u_b, v_b, k)
        I = np.stack((R, G, B), axis=2)
        Image.fromarray(I).save('%s\\svd_%d.png' % (output_path, k))<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值