首页 > 编程知识 正文

python将图像转化为灰度图像(python 显示图片)

时间:2023-05-06 18:51:51 阅读:72547 作者:4873

python是将图像转换为位图阵列的引言开发环境准备素材流程1,剪裁大小; 2、灰度处理3、二值化处理4、向位图数据变换即十六进制数组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 ) w,h ),打印图像大小后,可以轻松创建朝东的验证裁剪图像这里用的是128:64的大比例,当然可以自己定制

w_h=128/64#宽度:高度h_w=64/128#高度:宽度w,如果根据h=img.size#得到的图像尺寸if wh*w_h:#宽度大于高的值,则维持高度,并且在此处输入左上角,因此必须保持640480*128/64=960 #或完整宽度。 另一方面,修剪高度的new_img=img.crop((0,h*w_h,h ) ) else:# )的宽度小于高值并保持宽度

我们会进行更大比例的缩放

#在进行图像缩放的情况下,此处以128*64的分辨率(即大小为128x64small_img=new_img.resize () 128,64 ) )保存,之后进行验证用的small_img.save

2、灰度处理#转换为黑白图像#进行灰度处理的black_img=small_img.convert('l ) )效果如下。

3、二值化处理取得的图像数据量、十进制的

#转换为像素数据长度8192,128 * 64 bdata _ list=list (black _ img.get data ) )可以了解数据流的格式。

二值化,自己定义阈值(灰度极限)

#然后进行二值化。 #比这个值大的话就黑,比这个值小的话就白,可以再翻一下哦。 可以自行定制bvalue _ list=[0ifithresholdelse1foriinbdata _ list ],以实现背景颜色反转

4、要转换为位图数据,即十六进制数组,首先将数组分组,形成二进制字符串数组

#8位分组在一起ob_list=[]s='0b'forIinrange(1,len(bvalue_list )1) :s=str ) bvalue _ list I-1

最后将数据转换为十六进制

#转换为十六进制字符串格式两位ox_list=['0x''x'%int(I,2 ) for i in ob_list]#以下代码不保证固定两位格式(如0 )转换为0x0

j=0fori inox _ list : j=1print (I,end=',') if j==0: print ) '')处理后的数据如下:

5、导入完整代码frompilimportimageimg=image.open (img.jpg ) )图像w,查看h=img.size# (图像大小print(w ) w,h ) )裁剪矩形h=img.size#图像大小if wh*w_h:#宽度大于高度,因此保持高度并增加修剪宽度h ) ) else:# )如果宽度小于高值,请保留宽度,高度new _ h : # h_w*w ) ) ###########w () ) ) ) 64 ) #图像缩放此处为128*64的分辨率small_img.save(small.jpg ) 然后自定义二值化#灰度极限,比该极限大的值为黑色,比该值小的为白色的threshold=128b value _ list=[0ifithresholdelse1forinbdata _ list ] # # # 即s='0b'forIinrange(1,len(bvalue_list )1) :s=str ) bvalue_list(I-1 ) ) if I %8==03: ob _ ll 2 ) ]forIinob_list ) #################### () ) ) 652 ' ) if j==0: print ()在此验证试着在从在线图像传输位图的网站上进行比较。 地址在这里

将裁剪后的图像保存到本地

这个代码实现了保存。 在上面的过程中我们已经保存了

small_img.save(small.jpg ) )上传到网站查看效果

看看生成的位图数据。 在此选择一个字节,并将其水平(逐行阅读)存储。

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

选择列导入会导致图像混乱。

详细情况,上面由我们处理,下面由网站处理

总结起来有点不同。 这关系到我们的灰度处理和处理顺序。 请大家自己试一下,寻找最佳方案。 如果有问题的话请指出来。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。