<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python幫你上馬,哪里無(wú)碼打哪里

          共 2595字,需瀏覽 6分鐘

           ·

          2020-05-20 23:56

          來(lái)自公眾號(hào):Python專(zhuān)欄


          目錄

          0 引言

          1 環(huán)境

          2 需求分析

          3 代碼實(shí)現(xiàn)

          4 代碼全景展示

          5 后記


          0 引言

          所謂的像素圖,就是對(duì)圖像做一個(gè)顆?;男Ч?,使其產(chǎn)生一種妙不可言的朦朧感。費(fèi)話(huà)不多說(shuō),先來(lái)看一張效果圖。

          096d812f1708b762efce8e0f11e33f85.webp▲效果圖


          a7fb57cb38661592a518df9cac3b82ac.webp▲原圖


          怎么樣,效果還不錯(cuò)吧?現(xiàn)在,我們用Python來(lái)實(shí)現(xiàn)這種像素化的效果。


          1 環(huán)境

          操作系統(tǒng):Windows

          Python版本:3.7.3


          2 需求分析

          一個(gè)最簡(jiǎn)單的實(shí)現(xiàn)思路,在打開(kāi)圖片后,把圖片分割成一些像素塊,再對(duì)這些像素塊中的圖像信息進(jìn)行處理(修改圖像中的RGB值)即可。

          這里我們使用Numpy庫(kù)和PIL庫(kù)來(lái)實(shí)現(xiàn)這個(gè)需求,后者用來(lái)圖像的讀取與保存,涉及到的所有圖像處理動(dòng)作均借助Numpy來(lái)實(shí)現(xiàn)。

          有關(guān)NumPy模塊、PIL模塊的介紹,可參考如下。

          NumPy(Numerical Python) 是 Python 語(yǔ)言的一個(gè)擴(kuò)展程序庫(kù),支持大量的維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫(kù)。

          PIL(Python Imaging Library)是Python常用的圖像處理庫(kù),而Pillow是PIL的一個(gè)友好Fork,提供了了廣泛的文件格式支持,強(qiáng)大的圖像處理能力,主要包括圖像儲(chǔ)存、圖像顯示、格式轉(zhuǎn)換以及基本的圖像處理操作等。

          這兩個(gè)模塊非Python內(nèi)置,都屬于第三方模塊,可直接采用如下方式進(jìn)行安裝

          pip?install?numpy
          pip?install?Pillow


          注意,要想使用PIL模塊,是需要直接install Pillow模塊的。


          3 代碼實(shí)現(xiàn)

          首先導(dǎo)入我們要用到的模塊

          import?numpy?as?np
          from?PIL?import?Image

          ?

          接下來(lái),我們要處理圖片,首先得打開(kāi)一張圖片,如下

          data?=?Image.open("P:\Personal\LuoShen.xpg")

          ?

          然后把圖像轉(zhuǎn)換化Numpy數(shù)組進(jìn)行下一步的處理

          im1?=?np.array(data)

          ?

          這里處理的核心思想,也很簡(jiǎn)單,主要通過(guò)中間值的RGB,對(duì)所選范圍塊的RGB進(jìn)行重新賦值。

          im1[y:y?+?pixel,?x:x?+?pixel]?=?im1[y?+?(pixel?//?2)][x?+?(pixel?//?2)]


          這里的x、y是分別指的我們圖像的橫向、縱向像素點(diǎn)的坐標(biāo)值、而pixel指的是我們要以多大的像素塊,來(lái)處理這張圖像,我們?cè)O(shè)置的單位像素塊(Pixel數(shù)值)越小,生成的像素圖越精確。

          ?

          當(dāng)然了,若單位像素塊設(shè)置的太小,生成圖像就看不出效果了,至于多大的數(shù)值合適,需要自行嘗試。不同尺寸的圖像,要達(dá)到最佳的像素化的顯示效果,所需要設(shè)置的單位像素塊的大小也是不同的,實(shí)踐出真知。

          ?

          我們需要圖像的指定一個(gè)處理范圍,并對(duì)該范圍內(nèi)的每一個(gè)坐標(biāo)(像素)點(diǎn)進(jìn)行像素化的處理。

          for?y?in?range(Start_coordinate[1],?End_coordinate[1],?pixel):
          ????for?x?in?range(Start_coordinate[0],?End_coordinate[0],?pixel):
          ????????pass


          在處理完成之后,我們?cè)侔袾umpy數(shù)組轉(zhuǎn)換回圖像。

          im2?=?Image.fromarray(im1.astype(np.uint8))


          最后展示出處理后的圖像

          im2.show()


          4 代碼全景展示

          import?numpy?as?np
          from?PIL?import?Image

          def?to_pixelBlock(pixel,?Start_coordinate,?End_coordinate):?????
          ????'''?????
          ????:param?pixel:?單位像素塊的元素大小????????
          ????:param?Start_coordinate:?處理的起始坐標(biāo)(像素)點(diǎn),元組形式??????
          ????:param?End_coordinate:?處理的終止坐標(biāo)(像素)點(diǎn),元組形式????????
          ????:return:????????
          ????通過(guò)中間值的RGB,對(duì)所選范圍塊的RGB進(jìn)行重新賦值,設(shè)置的單位像素塊(Pixel數(shù)值)越小,生成的像素圖越精確
          ????'''

          ????#?讀取圖片,并由?PIL?image?轉(zhuǎn)換為?NumPy?array
          ????im1?=?np.array(Image.open("P:\Personal\LuoShen.jpg"))


          ????#?遍歷所要處理范圍內(nèi)的所有坐標(biāo)(像素)點(diǎn)
          ????for?y?in?range(Start_coordinate[1],?End_coordinate[1],?pixel):
          ????????for?x?in?range(Start_coordinate[0],?End_coordinate[0],?pixel):
          ????????????#?通過(guò)中間值的RGB,對(duì)所選范圍塊的RGB進(jìn)行重新賦值
          ????????????im1[y:y?+?pixel,?x:x?+?pixel]?=?im1[y?+?(pixel?//?2)][x?+?(pixel?//?2)]

          ????#?將NumPy?array?轉(zhuǎn)換為?PIL?image????????
          ????im2?=?Image.fromarray(im1.astype(np.uint8))
          ????#?展示處理后的圖像
          ????im2.show()


          if?__name__?==?'__main__':??????
          ????#?設(shè)置好要處理的像素范圍,并以多大的像素塊來(lái)生成最終效果圖
          ????to_pixelBlock(10,?(0,?0),?(1280,?800)


          5 后記

          本文使用了PIL加上Numpy的配合,短短幾行代碼實(shí)現(xiàn)了圖像像素化的處理。當(dāng)然這只是一種簡(jiǎn)單地實(shí)現(xiàn),要想實(shí)現(xiàn)更豐富的處理效果,還可以借助CV2來(lái)實(shí)現(xiàn)。

          ?

          好了,以上就是本篇全部?jī)?nèi)容。

          本文所涉及的完整代碼?

          GitHub:https://github.com/MiracleYoung/You-are-Pythonista/tree/master/PythonExercise/Tool/Convert_IMG_to_Pixel/

          好文章,我在看??

          瀏覽 38
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  伊人九色 | 日本综合久久 | 经典一区二区 | 热视频亚洲欧美 | 奇米久久久|