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.pswp.cn/news/371386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371386.shtml
英文地址,請注明出處:http://en.pswp.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…