python 实现将图像转化为位图数组
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 实现将图像转化为位图数组相关推荐
- python使用openCV图像加载(转化为灰度图像)、Canny边缘检测器检测图像的边缘(Detect Edges)
python使用openCV图像加载(转化为灰度图像).Canny边缘检测器检测图像的边缘(Detect Edges) 目录
- python使用openCV图像加载(转化为灰度图像)、使用filter2D函数对图像进行锐化(Sharpen Images)
python使用openCV图像加载(转化为灰度图像).使用filter2D函数对图像进行锐化(Sharpen Images) 目录
- python使用openCV图像加载(转化为灰度图像)、平滑图像处理就是将每个像素的值变换为其相邻元素的平均值、可视化平滑处理之后的图像(Blurring Images)
python使用openCV图像加载(转化为灰度图像).平滑图像处理就是将每个像素的值变换为其相邻元素的平均值.可视化平滑处理之后的图像(Blurring Images) 目录
- python二维、三维、思维数组之间的转化
python二维.三维.思维数组之间的转化 import numpy as np# 假设你有一个二维数组,形状为(32,10000) gray = np.random.randint(0, 256, ...
- python获取图片像素矩阵_用python处理图片实现图像中的像素访问
这篇文章主要介绍了关于用python处理图片实现图像中的像素访问,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然 ...
- python像素大于_用python处理图片实现图像中的像素访问
前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作.如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了.因此,通常我们加载完图片后,都 ...
- python能够处理图像的第三方库_基于图像预处理的几个库
python 里面有第三方库PIL Python第三方库使用 -- PIL 1.PIL 读取获得的图像矩阵与 numpy 下的多维数组 import numpy as np from PIL impo ...
- 基于python+opencv的图像目标区域自动提取
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 一.提取纸张中的内容 一张照片中的感兴趣区域总是沿着x,y,z三个轴都有一定倾斜(如下图),要 ...
- Python + Opencv 实现图像tif格式转jpg
笔者是一个材料学的研究生,经常做扫描(SEM)时脑袋短路,图片格式存成tif,到拷贝数据时才发现:怎么数据这么大?回来处理图像时又傻傻的将tif 转 jpg,很是苦恼.在此提醒坑友们:做实验时候要细心 ...
最新文章
- mascara-2(MetaMask/mascara本地实现)-连接线上钱包
- php 字符串去html,PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
- data中的数据如何在innerhtml中调用_Vuex中调用state数据
- 大牛书单 | 新年聊创新:技术人必备思维
- 066:ORM查询条件详解-startswith和endswith:
- svm分类器训练详细步骤_「五分钟机器学习」向量支持机SVM——学霸中的战斗机...
- VUE项目中使用this.$forceUpdate()强制页面重新渲染
- react dispatch_梳理下redux、mobx 在react的应用
- 深入浅出 - 公钥、私钥和数字签名最通俗的理解
- 洛谷P1938 找工就业
- 如何在Docker中安装MySQL
- 学习如何看懂SQL Server执行计划(一)——数据查询篇
- chrome浏览器版本简单介绍
- 使用MISO进行可变剪切的分析
- 地图编辑器到底是做什么的?今天之后你会对此有个新的了解
- SSL安全漏洞解决方案
- 2013年中国最新MBA学费对比
- 小米手机只能显示e或者无服务器,手机出现E网怎么回事
- keilC51编译常见错误和警告说明
- linux 时间 环境变量,Linux环境变量的修改(永久,暂时)以及修改ls显示的时间格式...
热门文章
- PHP程序员和Python程序员的职业前景怎么样?我来聊聊自己的体会
- Scrapy 对接 Splash
- Python爬虫技巧-西瓜视频MP4地址获取
- 【idea】IDEA 出现问题:Error running xxx Command line is too long. Shorten command line 解决方案
- 自考 02326 操作系统 简答题、综合题分类汇总解析
- 网秦与qq管家的bug,请你们修复
- AR交互将为早教机器人打开一片蓝海
- Sequence Game
- 视频教程-微信小程序开发教程(第1篇)-微信开发
- 在Virtualbox环境下win10与虚拟机通过FileZilla传输文件(FTP传输)