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

  • 引言
    • 开发环境
    • 准备素材
  • 流程
    • 1、裁剪尺寸;
    • 2、灰度处理
    • 3、二值化处理
    • 4、转化为位图数据也就是16进制数组
    • 5、完整代码
  • 验证
  • 总结

引言

目前在做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+=1print(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+=1print(i,end=",")if j%16==0:print("")

验证

这里我没有上板子验证,通过一个在线的图像转位图的网站进行对比,地址在这里
我们将裁剪的图像保存到本地

就是这行代码实现的保存,在上面的过程中我们已经保存了

small_img.save("small.jpg")

上传到网站看看效果

再看看生成的位图数据,这里选择一个字节,水平(一行一行读)存放:

上传我们的位图数据,进行图像生成看看效果,我们的数据也是水平保存的,白色背景,我们看看效果:

当如如果你选择 列读取会这样,图像乱了:

细节对比,上边是我们处理的,下边是网站处理的

总结

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

python 实现将图像转化为位图数组相关推荐

  1. python使用openCV图像加载(转化为灰度图像)、Canny边缘检测器检测图像的边缘(Detect Edges)

    python使用openCV图像加载(转化为灰度图像).Canny边缘检测器检测图像的边缘(Detect Edges) 目录

  2. python使用openCV图像加载(转化为灰度图像)、使用filter2D函数对图像进行锐化(Sharpen Images)

    python使用openCV图像加载(转化为灰度图像).使用filter2D函数对图像进行锐化(Sharpen Images) 目录

  3. python使用openCV图像加载(转化为灰度图像)、平滑图像处理就是将每个像素的值变换为其相邻元素的平均值、可视化平滑处理之后的图像(Blurring Images)

    python使用openCV图像加载(转化为灰度图像).平滑图像处理就是将每个像素的值变换为其相邻元素的平均值.可视化平滑处理之后的图像(Blurring Images) 目录

  4. python二维、三维、思维数组之间的转化

    python二维.三维.思维数组之间的转化 import numpy as np# 假设你有一个二维数组,形状为(32,10000) gray = np.random.randint(0, 256, ...

  5. python获取图片像素矩阵_用python处理图片实现图像中的像素访问

    这篇文章主要介绍了关于用python处理图片实现图像中的像素访问,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然 ...

  6. python像素大于_用python处理图片实现图像中的像素访问

    前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作.如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了.因此,通常我们加载完图片后,都 ...

  7. python能够处理图像的第三方库_基于图像预处理的几个库

    python 里面有第三方库PIL Python第三方库使用 -- PIL 1.PIL 读取获得的图像矩阵与 numpy 下的多维数组 import numpy as np from PIL impo ...

  8. 基于python+opencv的图像目标区域自动提取

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 一.提取纸张中的内容 一张照片中的感兴趣区域总是沿着x,y,z三个轴都有一定倾斜(如下图),要 ...

  9. Python + Opencv 实现图像tif格式转jpg

    笔者是一个材料学的研究生,经常做扫描(SEM)时脑袋短路,图片格式存成tif,到拷贝数据时才发现:怎么数据这么大?回来处理图像时又傻傻的将tif 转 jpg,很是苦恼.在此提醒坑友们:做实验时候要细心 ...

最新文章

  1. mascara-2(MetaMask/mascara本地实现)-连接线上钱包
  2. php 字符串去html,PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
  3. data中的数据如何在innerhtml中调用_Vuex中调用state数据
  4. 大牛书单 | 新年聊创新:技术人必备思维
  5. 066:ORM查询条件详解-startswith和endswith:
  6. svm分类器训练详细步骤_「五分钟机器学习」向量支持机SVM——学霸中的战斗机...
  7. VUE项目中使用this.$forceUpdate()强制页面重新渲染
  8. react dispatch_梳理下redux、mobx 在react的应用
  9. 深入浅出 - 公钥、私钥和数字签名最通俗的理解
  10. 洛谷P1938 找工就业
  11. 如何在Docker中安装MySQL
  12. 学习如何看懂SQL Server执行计划(一)——数据查询篇
  13. chrome浏览器版本简单介绍
  14. 使用MISO进行可变剪切的分析
  15. 地图编辑器到底是做什么的?今天之后你会对此有个新的了解
  16. SSL安全漏洞解决方案
  17. 2013年中国最新MBA学费对比
  18. 小米手机只能显示e或者无服务器,手机出现E网怎么回事
  19. keilC51编译常见错误和警告说明
  20. linux 时间 环境变量,Linux环境变量的修改(永久,暂时)以及修改ls显示的时间格式...

热门文章

  1. PHP程序员和Python程序员的职业前景怎么样?我来聊聊自己的体会
  2. Scrapy 对接 Splash
  3. Python爬虫技巧-西瓜视频MP4地址获取
  4. 【idea】IDEA 出现问题:Error running xxx Command line is too long. Shorten command line 解决方案
  5. 自考 02326 操作系统 简答题、综合题分类汇总解析
  6. 网秦与qq管家的bug,请你们修复
  7. AR交互将为早教机器人打开一片蓝海
  8. Sequence Game
  9. 视频教程-微信小程序开发教程(第1篇)-微信开发
  10. 在Virtualbox环境下win10与虚拟机通过FileZilla传输文件(FTP传输)