python 实现将图像转化为位图数组

本文介绍了一种将图像转化为位图数组的方法,包括裁剪、灰度处理、二值化及转换为16进制数组的过程,并通过在线工具进行了验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

目前在做Arduino的知识学习,在使用OLED屏幕的时候为了实现精美的图片展示,需要将图像转化为位图数组的形式,网上的资源很多,可是自己想实现一下,本篇记录下探索的过程。

开发环境

Jupyter 永远的神,当然这只是编写代码的环境,具体使用Python3,涉及pillow(PIL)的模块。

准备素材

百度上找了一个图片(PS:如果侵权请及时联系我删除)
在这里插入图片描述

流程

我准备将该图片放入128*64分辨率的0.96屏幕,显然这个图片比例和尺寸都不合适,而且Oled使用的是二值化图像,所以整个流程分为:

1、裁剪尺寸;

导入图片,我的图片尺寸是640X480

img = Image.open('img.jpg')	#读入图片
w,h=img.size	# 查看图片尺寸
print(w,h)		#打印图像尺寸,方便我们进行收东验证

裁剪图片,这里用的是128:64的宽高比例,当然可以自己自定义

w_h=128/64#宽:高
h_w=64/128#高:宽
w,h=img.size# 得到图片尺寸
if w>h*w_h:#宽比高值大,则保留高,裁剪宽
    #我们准备从左上角开始裁剪,这里输入左上角和右下角坐标
    #例如我是640X480图片,宽高比例128:64,因此640<480*128/64=960
    #也就是说我们需要保留完整的宽度,而去对高度进行裁剪
    new_img = img.crop((0, 0, h*w_h, h))
else:
	#宽比高值小,则保留宽,裁剪高
    new_img = img.crop((0, 0, w, h_w*w))

裁剪后的图像如下:
在这里插入图片描述
我们再进行等比例放缩

#进行图片缩放 这里用128*64的分辨率,即尺寸就是128X64
small_img=new_img.resize((128,64))
#保存一下,等下我们验证用的
small_img.save("small.jpg")

效果如下:
在这里插入图片描述

2、灰度处理

# 转化为黑白图片#进行灰度处理
black_img = small_img.convert("L")

效果如下:
在这里插入图片描述

3、二值化处理

获取图像的数据量,十进制的

#转换为像素数据 长度8192,128*64
bdata_list= list(black_img.getdata())

可以看到数据流的形式:
在这里插入图片描述
二值化,自己定义阈值(灰度界限)

# 接下来进行二值化
# 自定义灰度界限,大于这个值为黑色,小于这个值为白色,也可以翻过啦,实现背景色的反转
threshold = 128#阈值自己可以自定义
bvalue_list = [0 if i<threshold else 1 for i in bdata_list]

同样我们可以看到数据是这样的:
在这里插入图片描述

4、转化为位图数据也就是16进制数组

首先将数组进行分组,形成二进制字符串数组

#将8位一组放在一起
ob_list=[]
s="0b"
for i in range(1,len(bvalue_list)+1):
    s+=str(bvalue_list[i-1])
    if i%8==0:
        ob_list.append(s)
        s="0b"

我们可以看到数据是这样的:
在这里插入图片描述
最后将数据转化为16进制

#转换为16进制字符串 格式定位两位
ox_list=['0x'+'%02x' % int(i, 2) for i in ob_list]
#下面的代码 似乎不会保证固定的两位格式 比如0,会转化成0x0,而我们期望0x00
#ox_list=[hex(int(i, 2)) for i in ob_list]

我们16个一行输出

j=0
for i in ox_list:
    j+=1
    print(i,end=",")
    if j%16==0:
        print("")

处理之后的数据是这样的:
在这里插入图片描述

5、完整代码

from PIL import Image
img = Image.open('img.jpg')#读入图片
w,h=img.size# 查看图片尺寸
print(w,h)
#裁剪矩形,作为(左、上、右、下)元组,即左上角坐标和右下角坐标
w_h=128/64#宽:高
h_w=64/128#高:宽
#我们准备从左上角开始裁剪
w,h=img.size# 查看图片尺寸
if w>h*w_h:#宽比高值大,则保留高,裁剪宽
    new_img = img.crop((0, 0, h*w_h, h))
else:#宽比高值小,则保留宽,裁剪高
    new_img = img.crop((0, 0, w, h_w*w))
#####################################
small_img=new_img.resize((128,64))#进行图片缩放 这里用128*64的分辨率
small_img.save("small.jpg")
black_img = small_img.convert("L")# 转化为黑白图片#进行灰度处理
bdata_list= list(black_img.getdata())#转换为像素数据 长度8192
# 接下来进行二值化
# 自定义灰度界限,大于这个值为黑色,小于这个值为白色
threshold = 128
bvalue_list = [0 if i<threshold else 1 for i in bdata_list]
##############################################
#将8位一组放在一起
ob_list=[]
s="0b"
for i in range(1,len(bvalue_list)+1):
    s+=str(bvalue_list[i-1])
    if i%8==0:
        ob_list.append(s)
        s="0b"
#转换为16进制字符串 格式定位两位
ox_list=['0x'+'%02x' % int(i, 2) for i in ob_list]
#ox_list=[hex(int(i, 2)) for i in ob_list]
#########################################
j=0
for i in ox_list:
    j+=1
    print(i,end=",")
    if j%16==0:
        print("")

验证

这里我没有上板子验证,通过一个在线的图像转位图的网站进行对比,地址在这里
我们将裁剪的图像保存到本地
在这里插入图片描述
就是这行代码实现的保存,在上面的过程中我们已经保存了

small_img.save("small.jpg")

上传到网站看看效果
在这里插入图片描述
再看看生成的位图数据,这里选择一个字节,水平(一行一行读)存放:
在这里插入图片描述
上传我们的位图数据,进行图像生成看看效果,我们的数据也是水平保存的,白色背景,我们看看效果:
在这里插入图片描述
当如如果你选择 列读取会这样,图像乱了:
在这里插入图片描述
细节对比,上边是我们处理的,下边是网站处理的
在这里插入图片描述
在这里插入图片描述

总结

对比发现还是有些许差别的,这和我们灰度处理和处理的顺序都有关系,大家不妨自己尝试,寻找最佳的方案。如果有问题欢迎指出。

### 将灰度图像转换为矩阵表示 在编程环境中处理图像时,通常会将图像视为二维或三维的数据结构。对于灰度图像而言,其本质上是一个二维矩阵,其中每个元素代表像素的亮度值。不同编程环境提供了不同的方法来实现这一过程。 #### Python 中使用 OpenCV 和 NumPy 进行转换 Python 是一种广泛应用于计算机视觉和图像处理的语言之一。OpenCV 库配合 NumPy 可以方便地加载并操作图像文件作为数值数组: ```python import cv2 import numpy as np # 加载灰度图 image_path = 'path_to_your_grayscale_image.png' gray_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) if gray_img is None: raise FileNotFoundError('Image not found or unable to read.') # 显示原始尺寸大小 print(f'Original dimensions : {gray_img.shape}') # 转换成浮点数类型的矩阵以便后续运算 img_matrix = np.float32(gray_img) ``` 这段代码展示了如何读入一张本地存储的灰度图片,并将其转化为适合进一步分析的形式——即一个由 `numpy` 提供支持的多维数组对象[^1]。 #### MATLAB 中的操作方式 MATLAB 同样具备强大的图形处理能力,在该平台上可以直接利用内置函数轻松完成相同任务。给定一幅灰度位图,只需简单调用 imread 函数即可获得相应的双精度浮点型矩阵形式: ```matlab % 读取灰度图像到工作区变量 imgMatrix 中 imgPath = 'your_grayscale_image_file'; imgMatrix = double(imread(imgPath)); disp(['The size of the image matrix is ', num2str(size(imgMatrix))]); ``` 上述脚本说明了怎样把外部源中的静态影像导入内存空间内成为可供算法使用的量化表达式[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖人称王某人的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值