Python特效之?dāng)?shù)字成像方法詳解
一、特效預(yù)覽
處理前
處理后
細(xì)節(jié)放大后
二、程序原理
1.將圖片轉(zhuǎn)為灰白圖片后,將圖片分成了三塊,明、暗、陰影區(qū)域
2.明區(qū)域使用空白進(jìn)行填充
3.陰影區(qū)域使用橫線進(jìn)行填充
4.暗區(qū)域使用數(shù)字進(jìn)行填充,通過(guò)對(duì)暗區(qū)域的像素進(jìn)行分類(lèi),不同像素使用不同數(shù)字進(jìn)行填充即可
三、程序源碼
#!/usr/bin/env python # encoding: utf-8 import cv2 import random import numpy as np class digitalPicture: ''' This is a main Class, the file contains all documents. One document contains paragraphs that have several sentences It loads the original file and converts the original file to new content Then the new content will be saved by this class ''' def __init__(self): self.picture = 'assets/aaa.jpeg' def hello(self): ''' This is a welcome speech :return: self ''' print('*' * 50) print(' ' * 20 + '數(shù)字成像') print(' ' * 5 + 'Author: autofelix Date: 2022-01-06 13:14') print('*' * 50) return self def run(self): ''' The program entry ''' img = cv2.imread(self.picture) str_img = self.img_to_string(img) cv2.imwrite('result.jpg', str_img) print('處理完成?。。?!') def img_to_string(self, frame, K=6): """ 利用 聚類(lèi) 將像素信息聚為3或5類(lèi),顏色最深的一類(lèi)用數(shù)字密集地表示,陰影的一類(lèi)用“-”橫杠表示,明亮部分空白表示。 --------------------------------- frame:需要傳入的圖片信息??梢允莖pencv的cv2.imread()得到的數(shù)組,也可以是Pillow的Image.read()。 K:聚類(lèi)數(shù)量,推薦的K為3或5。根據(jù)經(jīng)驗(yàn),3或5時(shí)可以較為優(yōu)秀地處理很多圖像了。若默認(rèn)的K=5無(wú)法很好地表現(xiàn)原圖,請(qǐng)修改為3進(jìn)行嘗試。若依然無(wú)法很好地表現(xiàn)原圖,請(qǐng)換圖嘗試。 ( -_-|| ) --------------------------------- 聚類(lèi)數(shù)目理論可以取大于等于3的任意整數(shù)。但水平有限,無(wú)法自動(dòng)判斷當(dāng)生成的字符畫(huà)可以更好地表現(xiàn)原圖細(xì)節(jié)時(shí),“黑暗”、“陰影”、”明亮“之間邊界在哪。所以說(shuō)由于無(wú)法有效利用更大的聚類(lèi)數(shù)量,那么便先簡(jiǎn)單地限制聚類(lèi)數(shù)目為3和5。 """ if type(frame) != np.ndarray: frame = np.array(frame) height, width, *_ = frame.shape # 有時(shí)返回兩個(gè)值,有時(shí)三個(gè)值 frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) frame_array = np.float32(frame_gray.reshape(-1)) # 設(shè)置相關(guān)參數(shù)。 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) flags = cv2.KMEANS_RANDOM_CENTERS # 得到labels(類(lèi)別)、centroids(矩心)。 # 如第一行6個(gè)像素labels=[0,2,2,1,2,0],則意味著6個(gè)像素分別對(duì)應(yīng)著 第1個(gè)矩心、第3個(gè)矩心、第3、2、3、1個(gè)矩心。 compactness, labels, centroids = cv2.kmeans(frame_array, K, None, criteria, 10, flags) centroids = np.uint8(centroids) # labels的數(shù)個(gè)矩心以隨機(jī)順序排列,所以需要簡(jiǎn)單處理矩心. centroids = centroids.flatten() centroids_sorted = sorted(centroids) # 獲得不同centroids的明暗程度,0最暗 centroids_index = np.array([centroids_sorted.index(value) for value in centroids]) bright = [abs((3 * i - 2 * K) / (3 * K)) for i in range(1, 1 + K)] bright_bound = bright.index(np.min(bright)) shadow = [abs((3 * i - K) / (3 * K)) for i in range(1, 1 + K)] shadow_bound = shadow.index(np.min(shadow)) labels = labels.flatten() # 將labels轉(zhuǎn)變?yōu)閷?shí)際的明暗程度列表,0最暗。 labels = centroids_index[labels] # 列表解析,每2*2個(gè)像素挑選出一個(gè),組成(height*width*灰)數(shù)組。 labels_picked = [labels[rows * width:(rows + 1) * width:2] for rows in range(0, height, 2)] canvas = np.zeros((3 * height, 3 * width, 3), np.uint8) canvas.fill(255) # 創(chuàng)建長(zhǎng)寬為原圖三倍的白色畫(huà)布。 # 因?yàn)?字體大小為0.45時(shí),每個(gè)數(shù)字占6*6個(gè)像素,而白底畫(huà)布為原圖三倍 # 所以 需要原圖中每2*2個(gè)像素中挑取一個(gè),在白底畫(huà)布中由6*6像素大小的數(shù)字表示這個(gè)像素信息。 y = 8 for rows in labels_picked: x = 0 for cols in rows: if cols <= shadow_bound: cv2.putText(canvas, str(random.randint(2, 9)), (x, y), cv2.FONT_HERSHEY_PLAIN, 0.45, 1) elif cols <= bright_bound: cv2.putText(canvas, "-", (x, y), cv2.FONT_HERSHEY_PLAIN, 0.4, 0, 1) x += 6 y += 6 return canvas if __name__ == '__main__': digitalPicture().hello().run()
以上就是Python特效之?dāng)?shù)字成像方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python數(shù)字成像的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)在Word中創(chuàng)建表格并填入數(shù)據(jù)與圖片
在Word中,表格是一個(gè)強(qiáng)大的工具,本文主要為大家介紹了如何使用Python在Word中創(chuàng)建表格并填入數(shù)據(jù)、圖片,以及設(shè)置表格樣式等,感興趣的可以了解下2024-03-03使用PyCharm安裝pytest及requests的問(wèn)題
這篇文章主要介紹了使用PyCharm安裝pytest及requests的相關(guān)資料,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Python基于遞歸和非遞歸算法求兩個(gè)數(shù)最大公約數(shù)、最小公倍數(shù)示例
這篇文章主要介紹了Python基于遞歸和非遞歸算法求兩個(gè)數(shù)最大公約數(shù)、最小公倍數(shù),涉及Python遞歸算法、流程循環(huán)控制進(jìn)行數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-05-05python按照多個(gè)字符對(duì)字符串進(jìn)行分割的方法
這篇文章主要介紹了python按照多個(gè)字符對(duì)字符串進(jìn)行分割的方法,涉及Python中正則表達(dá)式匹配的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03在VSCode中添加Python解釋器并安裝Python庫(kù)的方法
這篇文章主要介紹了在VSCode中添加Python解釋器并安裝Python庫(kù)的方法,本文分步驟通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02Python給exe添加以管理員運(yùn)行的屬性方法詳解
這篇文章主要為大家介紹了Python給exe添加以管理員運(yùn)行的屬性方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12PyTorch?使用torchvision進(jìn)行圖片數(shù)據(jù)增廣
本文主要介紹了PyTorch?使用torchvision進(jìn)行圖片數(shù)據(jù)增廣,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05