python将图像转换为8位单通道_使用Python将图片转换为单通道黑白图片

本文介绍如何使用python将图片转换为纯黑白的单通道图片。文中用到的脚本支持彩色、灰度、带alpha通道的输入图片以及SVG矢量图,支持调整输出图片大小以及设置灰度阈值。

最后介绍如何输出SSD1306 OLED显示屏可用的XBM文件,并利用输出的XBM数据在0.96寸的OLED屏幕上显示图标,例如下图中的温度、闹钟及云朵图标通过本脚本生成:

使用方法

通过pip安装依赖包:pip3 install --user pillow argparse numpy cairosvg

从下文拷贝python脚本为tobw.py.

要把非单通道图片(如彩色、灰度或带alpha通道的PNG图片)转换图片 只需指定输入图片路径和输除路径即可:$ python tobw.py -i input.png -o output_bw.jpg

通过-h选项查看其他可选参数:$ python tobw.py -h

usage: tobw.py [-h] -i INPUT_IMAGE -o OUTPUT_IMAGE [-t THRESHOLD] [-r] [-s SIZE] [-p]

optional arguments:

-h, --help show this help message and exit

-i INPUT_IMAGE, --input-image INPUT_IMAGE

Input image

-o OUTPUT_IMAGE, --output-image OUTPUT_IMAGE

output image

-t THRESHOLD, --threshold THRESHOLD

(Optional) Threshold value, a number between 0 and 255

-r, --invert-bw (Optional) Invert black and white

-s SIZE, --size SIZE (Optional) Resize image to the specified size, eg., 16x16

-p, --print (Optional) Print result

-s 缩放图片

使用-s选项设置输出图片的大小,不设置时,输出与输入大小相同。例如把输出图片设置微16X16像素大小:python3 tobw.py -i input.png -o output_bw.jpg -s 16x16需要注意如果输出图片长宽比与输入图片长宽比不一致,图片会被拉伸或压缩。

-t 调整阈值

使用-t选项设置输出为黑或白像素点的灰度阈值,取值范围为0-255. 值越小就有更多像素点被设置为白色。如果输出图片丢失的细节过多时,可以适当调整本参数。

反转输出的黑白像素

使用-r参数后,原来输出白色的像素点将显示微黑色,反之亦然。输入图片的明暗区域恰好与显示屏相反时可以使用本参数。

在ESP8266 Arduino里使用

使用esp8266-oled-ssd1306库提供的drawXbm(x, y, img_width, img_height, img)方法在屏幕上绘制图片,drawXbm的5个参数分别是x, y: 图片的坐标,屏幕左上角坐标为(0, 0) 。此处设置的坐标对应图片左上角位置。

img_width: 图片的实际宽度。

img_height: 图片的实际高度。

img: XBM图片字节,使用tobw.py的-p参数获取。

esp8266-oled-ssd1306使用XBM格式图片,使用tobw.py的-p参数获取,例如下面的示例把svg图片转换为12x12像素输出,并打印XBM格式数据。注意返回的im_bits,这就是drawXbm最后一个参数需要的数据。$ python3 tobw.py -i rain.svg -o rain_bw.jpg -s 12x12 -t 200 -p

111000001111

110001000111

110011100011

100111110001

001111111100

011111111110

001100000100

000000000000

100000000001

111000001111

111100111111

111100111111

Result as XBM image:

#define im_width 12

#define im_height 12

static char im_bits[] = {

0x07,0x0f,0x23,0x0e,0x73,0x0c,0xf9,0x08,0xfc,0x03,0xfe,0x07,0x0c,0x02,0x00,

0x00,0x01,0x08,0x07,0x0f,0xcf,0x0f,0xcf,0x0f

};

源码# Convert image to pure black and white

# Show usages:

# python tobw.py -h

# python tobw.py -i rain.svg -o rain_bw.jpg -s 12x12 -t 200

from PIL import Image, UnidentifiedImageError

import argparse

import numpy as np

from cairosvg import svg2png

import os

from random import random

ap = argparse.ArgumentParser()

ap.add_argument("-i", "--input-image", help="Input image", type=str, required=True)

ap.add_argument("-o", "--output-image", help="output image", type=str, required=True)

ap.add_argument("-t", "--threshold",

help="(Optional) Threshold value, a number between 0 and 255", type=int, default=128)

ap.add_argument("-r", "--invert-bw",

help="(Optional) Invert black and white", action='store_true')

ap.add_argument("-s", "--size", help="(Optional) Resize image to the specified size, eg., 16x16", type=str)

args = vars(ap.parse_args())

invert_bw = args['invert_bw']

threshold = args['threshold']

if threshold > 255 or threshold < 0:

raise Exception('Invalid threshold value!')

img_in = args['input_image']

img_out = args['output_image']

if args['size']:

size = [int(n) for n in args['size'].lower().split('x')]

else:

size = None

high = 255

low = 0

if invert_bw:

high = 0

low = 255

def replace_ext(filename, new_ext):

ext = filename.split('.')[-1] if '.' in filename else ''

return filename[:len(filename)-len(ext)] + str(new_ext)

def remove_transparency(im, bg_colour=(255, 255, 255)):

# https://stackoverflow.com/questions/35859140/remove-transparency-alpha-from-any-image-using-pil/35859141

# Only process if image has transparency (http://stackoverflow.com/a/1963146)

if im.mode in ('RGBA', 'LA') or (im.mode == 'P' and 'transparency' in im.info):

alpha = im.convert('RGBA').getchannel('A')

bg = Image.new("RGBA", im.size, bg_colour + (255,))

bg.paste(im, mask=alpha)

return bg

else:

return im

# color image

try:

col = Image.open(img_in)

except UnidentifiedImageError:

if (img_in.lower().endswith('.svg')):

tmp = replace_ext(img_in, '{}.png'.format(random()))

svg2png(url=img_in, write_to=tmp)

col = Image.open(tmp)

else:

raise Exception('unknown image type')

if size:

col = col.resize(size)

col = remove_transparency(col)

gray = col.convert('L')

bw = gray.point(lambda x: low if x < threshold else high, '1')

bw.save(img_out)

for u8 in np.uint8(bw):

print(''.join(str(c) for c in u8))

print()

print('Result as XBM image:')

if (img_out.lower().endswith('.xbm')):

print(open(img_out).read())

else:

xbm_out = replace_ext(img_in, '{}.xbm'.format(random()))

bw.save(xbm_out)

print(open(xbm_out).read())

os.remove(xbm_out)

if tmp is not None:

os.remove(tmp)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java FlameGraph 火焰图

上周一个偶然的机会听同事提到了Java FlameGraph&#xff0c;刚实验了一下&#xff0c;效果非常好。 一、什么是FlameGraph 直接看图说话。FlameGraph 是 SVG格式&#xff0c;矢量图&#xff0c;可以随意扩大缩小&#xff0c;看不清的信息可以放大看。图中&#xff0c;各种红橙…

ADB 常用命令

获取Android设备号 adb shell getprop ro.serialno 获取系统版本 adb shell getprop ro.build.version.release>4.2.2 获取系统api版本 adb shell getprop ro.build.version.sdk>17 获取设备分辨率&#xff08;SDK4.3&#xff09; adb shell wm size获取设备屏幕密度&am…

哪个Java线程消耗了我的CPU?

当您的Java应用程序占用100&#xff05;的CPU时&#xff0c;您该怎么办&#xff1f; 事实证明&#xff0c;您可以使用内置的UNIX和JDK工具轻松找到有问题的线程。 不需要探查器或代理。 为了进行测试&#xff0c;我们将使用以下简单程序&#xff1a; public class Main {publi…

烟草局计算机笔试,2020年广西南宁烟草局什么时候笔试?

最近广西烟草局各地市社招通知频发&#xff0c;南宁烟草局报名截止至今都无任何消息&#xff0c;根据往年的考情&#xff0c;通知近期很大可能会发布&#xff0c;将于6月底完成笔面!你备考好了吗&#xff1f;今天广西中公国企小编来给大家说一下南宁烟草局社招的笔试内容及备考…

JAVA Swing 组件演示***

下面是Swing组件的演示&#xff1a; package a_swing;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.…

Spring 3.1缓存和@CacheEvict

我的上一个博客演示了Spring 3.1的Cacheable批注的应用&#xff0c; Cacheable批注用于标记返回值将存储在缓存中的方法。 但是&#xff0c; Cacheable只是Spring的Guy为缓存而设计的一对注释​​中的一个&#xff0c;另一个是CacheEvict 。 像Cacheable一样&#xff0c; Cache…

centos 获取硬件序列号_如何在 Linux 上查找硬件规格

在 Linux 系统上有许多工具可用于查找硬件规格。-- Sk&#xff08;作者&#xff09;在 Linux 系统上有许多工具可用于查找硬件规格。在这里&#xff0c;我列出了四种最常用的工具&#xff0c;可以获取 Linux 系统的几乎所有硬件&#xff08;和软件&#xff09;细节。好在是这些…

位置服务器管理器,查看 DIMM 位置

键入&#xff1a;-> show /System/Memory/DIMMs -t locationTarget | Property | Value-----------------------------------------------------------------------/System/Memory/DIMMs/ | location | CMIOU0/CM/CMP/BOB00/CH0/DIMM (CPU MemoryDIMM_0 | | IO Unit 0 Memor…

Spring –持久层–编写实体并配置Hibernate

欢迎来到本教程的第二部分。 当您看到本文有多长时间时&#xff0c;请不要惊慌–我向您保证&#xff0c;这主要是简单的POJO和一些生成的代码。 在开始之前&#xff0c;我们需要更新我们的Maven依赖项&#xff0c;因为我们现在将使用Hibernate和Spring。 将以下依赖项添加到pom…

无线服务器主机名是,wifi默认服务器主机名

wifi默认服务器主机名 内容精选换一换以CentOS 7操作系统的弹性云服务器为例&#xff1a;登录Linux弹性云服务器&#xff0c;查看“cloud-init”的配置文件。检查“/etc/cloud/cloud.cfg”文件中“update_hostname”是否被注释或者删除。如果没有被注释或者删除&#xff0c;则需…

pygame里面物体闪烁运动_利用自闪烁发光二极管探究小车在倾斜轨道上的运动规律...

2020年11月23日&#xff0c;周一&#xff0c;24小时安全值班。利用当班中午的时间&#xff0c;微主在创客空间测试了自闪烁发光二极管在匀加速运动中的效果&#xff0c;结果还比较满意。将小车放置在倾斜的轨道上&#xff0c;将自闪烁发光二极管和纽扣电池构成频闪光源&#xf…

python网络爬虫与信息提取 学习笔记day3

Day3&#xff1a; 只需两行代码解析html或xml信息 具体代码实现:day3_1 注意BeautifulSoup的B和S需要大写&#xff0c;因为python大小写敏感 import requests r requests.get("http://python123.io/ws/demo.html") r.text demo r.text from bs4 import Beauti…

番石榴文件:Java文件管理

正如我在这里 &#xff0c; 这里 &#xff0c; 这里和这里所讨论的那样&#xff0c; Groovy和Java SE 7都为Java文件管理提供了改进。 但是&#xff0c;当特定的Java应用程序尚不能使用Java SE 7或Groovy进行文件管理时&#xff0c;仍然可以通过使用Guava的Files类获得改进的文…

顺序查找

顺序查找属于查找中较容易的一个方法&#xff0c;且对数据是否已经排序没有要求&#xff0c;是很常用的一个查找算法。 但缺点是必须一个一个数字进行比较查找&#xff0c;查找所需步骤可能较多。 顺序查找算法的思想是&#xff0c;将目标与待查找数据进行比较&#xff0c;若发…

王者荣耀微信哪个服务器人最少,王者荣耀:微信区王者人数锐减,大神们都去哪了?这些原因很真实...

原标题&#xff1a;王者荣耀&#xff1a;微信区王者人数锐减&#xff0c;大神们都去哪了&#xff1f;这些原因很真实王者荣耀&#xff1a;微信区王者人数锐减&#xff0c;大神们都去哪了&#xff1f;这些原因很真实大家好&#xff01;王者荣耀S16赛季已经开启一月之余&#xff…

一个div压在另一个div上面_【CSS小分享】用CSS画一个新拟态风格键盘

什么是新拟态新拟态的英文名称是“Neumorphism”&#xff0c;也有人称为“Soft UI”。简单讲&#xff0c;新拟态是一种图形样式&#xff0c;其原理是通过模拟真实物体来为界面的UI元素赋予真实感。新拟态风格起源于dribbble&#xff0c;后面陆续被收录在2020设计趋势预测里面&a…

JBoss BRMS与JasperReports进行报告

介绍 Jasperreports是一个免费的可下载库&#xff0c;可用于为Java EE应用程序生成丰富的报告。 本指南还提供了使用Jasper iReport设计器生成报告模板的步骤。 软件需求 JBoss BRMS 5.3&#xff08;从客户门户网站http://access.redhat.com &#xff09; JasperReports 4.6…

java字符串 删除指定字符的那些事

需求如下&#xff1a; 1.算出2周以前的时间&#xff0c;以正常日期格式返回 2.如果月份和日期前面有0需要去掉返回结果&#xff0c;比如&#xff1a;2017-08-15 就需要显示2017-8-15。 Calendar calendar Calendar.getInstance();calendar.add(Calendar.DATE, -14);Date date…

Hibernate中Hql查询

这篇随笔将会记录hql的常用的查询语句&#xff0c;为日后查看提供便利。 在这里通过定义了三个类&#xff0c;Special、Classroom、Student来做测试&#xff0c;Special与Classroom是一对多&#xff0c;Classroom与Student是一对多的关系&#xff0c;这里仅仅贴出这三个bean的属…

Java代码质量工具–概述

最近&#xff0c;我有机会在本地IT社区聚会上介绍了该主题。 这是基本演示&#xff1a; Java代码质量工具 以及更有意义的思维导图&#xff1a; 但是&#xff0c;我认为我需要更深入地探讨这一主题。 这篇博客文章应该像是在此方向上进行进一步调查的起点。 1. CodePro Anal…