目錄 0 引言 1 環境 2 需求分析 3 代碼實現 4 代碼全景展現 5 後記python
所謂的像素圖,就是對圖像作一個顆粒化的效果,使其產生一種妙趣橫生的朦朧感。費話很少說,先來看一張效果圖。數組
<center>▲效果圖<center>函數
<center>▲原圖<center>ui
怎麼樣,效果還不錯吧?如今,咱們用Python來實現這種像素化的效果。操作系統
操做系統:Windows3d
Python版本:3.7.3code
一個最簡單的實現思路,在打開圖片後,把圖片分割成一些像素塊,再對這些像素塊中的圖像信息進行處理(修改圖像中的RGB值)便可。blog
這裏咱們使用Numpy庫和PIL庫來實現這個需求,後者用來圖像的讀取與保存,涉及到的全部圖像處理動做均藉助Numpy來實現。圖片
有關NumPy模塊、PIL模塊的介紹,可參考以下。ip
NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
PIL(Python Imaging Library)是Python經常使用的圖像處理庫,而Pillow是PIL的一個友好Fork,提供了了普遍的文件格式支持,強大的圖像處理能力,主要包括圖像儲存、圖像顯示、格式轉換以及基本的圖像處理操做等。
這兩個模塊非Python內置,都屬於第三方模塊,可直接採用以下方式進行安裝
pip install numpy pip install Pillow
注意,要想使用PIL模塊,是須要直接install Pillow模塊的。
首先導入咱們要用到的模塊
import numpy as np from PIL import Image
接下來,咱們要處理圖片,首先得打開一張圖片,以下
data = Image.open("P:\\Personal\\LuoShen.xpg")
而後把圖像轉換化Numpy數組進行下一步的處理
im1 = np.array(data)
這裏處理的核心思想,也很簡單,主要經過中間值的RGB,對所選範圍塊的RGB進行從新賦值。
im1[y:y + pixel, x:x + pixel] = im1[y + (pixel // 2)][x + (pixel // 2)]
這裏的x、y是分別指的咱們圖像的橫向、縱向像素點的座標值、而pixel指的是咱們要以多大的像素塊,來處理這張圖像,咱們設置的單位像素塊(Pixel數值)越小,生成的像素圖越精確。
固然了,若單位像素塊設置的過小,生成圖像就看不出效果了,至於多大的數值合適,須要自行嘗試。不一樣尺寸的圖像,要達到最佳的像素化的顯示效果,所須要設置的單位像素塊的大小也是不一樣的,實踐出真知。
咱們須要圖像的指定一個處理範圍,並對該範圍內的每個座標(像素)點進行像素化的處理。
for y in range(Start_coordinate[1], End_coordinate[1], pixel): for x in range(Start_coordinate[0], End_coordinate[0], pixel): pass
在處理完成以後,咱們再把Numpy數組轉換回圖像。
im2 = Image.fromarray(im1.astype(np.uint8))
最後展現出處理後的圖像
im2.show()
import numpy as np from PIL import Image def to_pixelBlock(pixel, Start_coordinate, End_coordinate): ''' :param pixel: 單位像素塊的元素大小 :param Start_coordinate: 處理的起始座標(像素)點,元組形式 :param End_coordinate: 處理的終止座標(像素)點,元組形式 :return: 經過中間值的RGB,對所選範圍塊的RGB進行從新賦值,設置的單位像素塊(Pixel數值)越小,生成的像素圖越精確 ''' # 讀取圖片,並由 PIL image 轉換爲 NumPy array im1 = np.array(Image.open("P:\\Personal\\LuoShen.jpg")) # 遍歷所要處理範圍內的全部座標(像素)點 for y in range(Start_coordinate[1], End_coordinate[1], pixel): for x in range(Start_coordinate[0], End_coordinate[0], pixel): # 經過中間值的RGB,對所選範圍塊的RGB進行從新賦值 im1[y:y + pixel, x:x + pixel] = im1[y + (pixel // 2)][x + (pixel // 2)] # 將NumPy array 轉換爲 PIL image im2 = Image.fromarray(im1.astype(np.uint8)) # 展現處理後的圖像 im2.show() if __name__ == '__main__': # 設置好要處理的像素範圍,並以多大的像素塊來生成最終效果圖 to_pixelBlock(10, (0, 0), (1280, 800)
本文使用了PIL加上Numpy的配合,短短几行代碼實現了圖像像素化的處理。固然這只是一種簡單地實現,要想實現更豐富的處理效果,還能夠藉助CV2來實現。
好了,以上就是本篇所有內容。
公衆號「Python專欄」後臺回覆:「馬賽克」,獲取本文所涉及的完整代碼。