欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python特效之?dāng)?shù)字成像方法詳解

 更新時(shí)間:2022年01月19日 09:47:33   作者:autofelix  
所謂數(shù)字成像,即將原圖片經(jīng)過(guò)python處理后,生成完全由純數(shù)字組成的圖像。本文將具體為大家介紹一下這一效果如何實(shí)現(xiàn),需要的可以參考一下

一、特效預(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)文章

最新評(píng)論