網站首頁 編程語言 正文
一、特效預覽
處理前
處理后
細節放大后
二、程序原理
1.將圖片轉為灰白圖片后,將圖片分成了三塊,明、暗、陰影區域
2.明區域使用空白進行填充
3.陰影區域使用橫線進行填充
4.暗區域使用數字進行填充,通過對暗區域的像素進行分類,不同像素使用不同數字進行填充即可
三、程序源碼
#!/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 + '數字成像') 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): """ 利用 聚類 將像素信息聚為3或5類,顏色最深的一類用數字密集地表示,陰影的一類用“-”橫杠表示,明亮部分空白表示。 --------------------------------- frame:需要傳入的圖片信息。可以是opencv的cv2.imread()得到的數組,也可以是Pillow的Image.read()。 K:聚類數量,推薦的K為3或5。根據經驗,3或5時可以較為優秀地處理很多圖像了。若默認的K=5無法很好地表現原圖,請修改為3進行嘗試。若依然無法很好地表現原圖,請換圖嘗試。 ( -_-|| ) --------------------------------- 聚類數目理論可以取大于等于3的任意整數。但水平有限,無法自動判斷當生成的字符畫可以更好地表現原圖細節時,“黑暗”、“陰影”、”明亮“之間邊界在哪。所以說由于無法有效利用更大的聚類數量,那么便先簡單地限制聚類數目為3和5。 """ if type(frame) != np.ndarray: frame = np.array(frame) height, width, *_ = frame.shape # 有時返回兩個值,有時三個值 frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) frame_array = np.float32(frame_gray.reshape(-1)) # 設置相關參數。 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) flags = cv2.KMEANS_RANDOM_CENTERS # 得到labels(類別)、centroids(矩心)。 # 如第一行6個像素labels=[0,2,2,1,2,0],則意味著6個像素分別對應著 第1個矩心、第3個矩心、第3、2、3、1個矩心。 compactness, labels, centroids = cv2.kmeans(frame_array, K, None, criteria, 10, flags) centroids = np.uint8(centroids) # labels的數個矩心以隨機順序排列,所以需要簡單處理矩心. 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轉變為實際的明暗程度列表,0最暗。 labels = centroids_index[labels] # 列表解析,每2*2個像素挑選出一個,組成(height*width*灰)數組。 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) # 創建長寬為原圖三倍的白色畫布。 # 因為 字體大小為0.45時,每個數字占6*6個像素,而白底畫布為原圖三倍 # 所以 需要原圖中每2*2個像素中挑取一個,在白底畫布中由6*6像素大小的數字表示這個像素信息。 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()
原文鏈接:https://blog.csdn.net/weixin_41635750/article/details/122416171
- 上一篇:用C語言實現排雷游戲_C 語言
- 下一篇:用python實現彈球小游戲_python
相關推薦
- 2022-04-02 Docker中Dockerfile制作鏡像的方法步驟_docker
- 2022-05-02 python?異常捕獲詳解流程_python
- 2022-08-01 Oracle停止數據泵導入數據的方法詳解_oracle
- 2022-08-18 Python壓縮包處理模塊zipfile和py7zr操作代碼_python
- 2022-04-18 2.* 版本taro引入 taro-ui編譯小程序階段報錯, Module not found: C
- 2024-03-09 【Redis】Redis 實現分布式Session
- 2022-11-10 rust延遲5秒鎖屏的實現代碼_相關技巧
- 2023-01-03 Python使用asyncio包處理并發的實現代碼_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支