Python圖像處理——人物拼圖遊戲

開發工具:VS Codepython

1.遊戲介紹算法

拼圖遊戲將一幅圖片分割鹹若干拼塊並將它們隨機打亂順序,當將全部拼塊都放回原位置時,就完成了拼圖(遊戲結束)。本人物拼圖遊戲爲3行3列,拼塊以隨機順序排列,玩家用鼠標單擊空白塊四周的交換它們位置,直到全部拼塊都回到原位置。拼圖遊戲運行界面數組

2.程序設計思路dom

遊戲程序首先將圖片分割成相應3行3列的拼塊,並按順序編號。動態地生成一個\爲3x3的列表board,用於存放數字0一8,其中,每一個數字表明一個拼塊,8號拼塊不顯示。函數

遊戲開始時,隨機打亂這個數組board,如board[0l[0]是5號拼塊,則在左上角顯示編號是5的拼塊。根據玩家用鼠標單擊的拼塊和空白塊所在位置,來交換該board數組對應的元素,最後經過元素排列順序來判斷是否已經完成遊戲。工具

0 1 2 3 4 5 6 7 8 打亂後開發工具

5 8 2 4 6 3 1 7 0字體

3.python圖像處理設計

Python圖像處理類庫3d

Python圖像處理類庫(Python Imaging Library,PIL)提供了通用的圖像處理功能,以及大量實用的基本圖像操做,如圖像縮放、裁剪、旋轉、顏色轉換等。PIL是Python語言的第三方庫須要安裝庫的名字是pillow。

PIL支持圖像存儲、顯示和處理,它可以處理幾乎全部的圖片格式,能夠完成對圖像的縮放、剪裁、疊加以及向圖像添加線條和文字等操做。

PIL主要能夠知足圖像歸檔和圖像處理兩方面的功能需求。

(1)圖像歸檔:對圖像進行批處理、生成圖像預覽、轉換圖像格式等。

(2)圖像處理:包括圖像基本處理、像素處理、顏色處理等。

根據功能的不一樣,PIL可分爲21個與圖像相關的類,這些類能夠被看做是子庫或PIL中的模塊,部分模塊名以下:

Image、 ImageChops、 ImageCrackCode、 ImageDraw、 ImageEnhance、 ImageFile、ImageFileIO, ImageFilter, ImageFont, ImageGrab, ImageOps, ImagePath, ImageSequence,ImageStat, ImageTk, ImageWin. PSDraW。

1。 Image模塊

Image模塊是PIL中最重要的模塊,它提供了諸多圖像操做的功能,好比,倉g建、打開、顯示、保存圖像等功能,合成、裁剪、濾波等功能,獲取圖像屬性(如圖像直方圖、通道數等)功能。

PIL中的Image模塊提供Image類,咱們可使用Image類從大多數圖像格式的文件中讀取數據,而後寫入最多見的圖像格式文件中。若要讀取一幅圖像,則可使用以下代碼:

from PIL import Image

pil_ im = Image.open ('empire. jpg')

也能夠直接使用Image.new(mode,size,color=None)建立圖像對象,color的默認值是黑色。

2. ImageChops模塊

ImageChops模塊包含一些算術圖形操做,稱爲通道操做(channel operations)。這些操做可用於諸多目的,如圖像特效、圖像組合、算法繪圖等。通道操做只用於位圖像(如「L」模式和「RGB」模式)。大多數通道操做有一個或者兩個圖像參數,返回一個新的圖像。

每張圖片都由一個或者多個數據通道構成,以RGB圖像爲例,每張圖片都由三個數據通道構成,分別爲R、G和B通道。而對於灰度圖像,則只有一個通道。

  1. ImageDravv模塊

ImageDraw模塊爲image對象提供了基本的圖形處理功能,例如,它能夠爲圖像添加幾何圖形。

4。ImageEnhance模塊

ImageEnhance模塊包括一些用於圖像加強的類。它們分別爲Color類、Brightness類、Contrast類和Sharpness類。

5。ImageFile模塊

ImageFile模塊爲圖像打開和保存功能提供了支持。

  1. ImageFitter模塊

ImageFilter模塊包括各類濾波器的預約義集合,常與Image類的filter方法一塊兒使用。該模塊包含了以下的圖像加強的濾波器: BLUR、CONTOUR、DETAIL、EDGEENHANCE, EDGE ENHANCE MORE, EMBOSS, FIND EDGES, SMOOTH, SMOOTHMORE和SHARPEN。

  1. ImageFont模塊

ImageFont模塊定義了一個同名的類,即ImageFont類。這個類的實例中存儲着bitmap字體,須要與ImageDraw類的text方法一塊兒使用。

Image模塊是PIL中最重要的模塊,它提供了一個相同名稱的類,即Image類,用於表示PIL圖像。Image類提供了不少方法對圖像進行處理,

複製和粘貼圖像區域

咱們可使用crop()方法從一幅圖像中裁剪指定區域,

調整尺寸和旋轉

若要調整一幅圖像的尺寸,咱們能夠調用resize()方法。該方法的參數是一個元組,用來指定新圖像的大小,方法以下:

out ^ im.resize 《128,128》

若要旋轉一幅圖像,則可使用逆時針方式表示旋轉角度,而後調用rotate()方法:

out = im。rotate (45)

轉換成灰度圖像

對於彩色圖像,無論其圖像格式是PNG,仍是BMP,或者是JPG,在P兒中,使用Image模塊的open()函數將其打開後,返回的圖像對象的模式都是「RGB」。而對於灰度 /圖像,無論其圖像格式是PNG,仍是BMP,或者JPG,打開後,其模式都爲「L」。

PNG、BMP和JPG彩色圖像格式之間的互相轉換均可以經過Image模塊的open()和save()函數來完成。具體來講,在打開這些圖像時,PIL會將它們解碼爲三通道的‘RGB」圖像。用戶能夠基於這個「RGB」圖像,對其進行處理。處理完畢後,使用函save(),就能夠將處理結果保存成PNG、BMP和JPG三種格式中的任何一種。這樣也完成了幾種格式之間的轉換。固然,對於不一樣格式的灰度圖像,也可經過相似途徑完,只是PIL解碼後是模式爲「L」的圖像。

Image模塊的convert()函數,可用於不一樣模式圖像之間的轉換。

convert0函數有3種形式的定義,分別以下:

im.convert (mode)

im.convert(,P,, **options)

im.convert {mode, matrix)

這3種形式定義的函數使用不一樣的參數,將當前的圖像轉換爲新的模式(PIL中有乙種不一樣模式。分別爲一、L、P、RGB、RGBA、CMYK、YCbCr、I、F),併產生新的圖像做爲返回值。

模式L」爲灰色圖像,它的每一個像素用8個bit表示,0表示黑,255表示白,其餘數字表示不一樣的灰度。在PIL中,從模式「RGB」轉換爲「I」模式是按照下面的公麥重進行的:

L =R * 299/1000+G * 587/1000+ B *114 /1000

打開圖片並轉換成灰度圖的方法是:

im=Image.open{ 'a.jpg’).convert(,L)

若是要將圖片轉換成黑白圖片(爲二值圖像),那麼模式就是「1」(非黑即白)。可是它每一個像素用8個bit表示,0表示黑,255表示白

對像素進行操做

getpixel(x,y)可用於獲取指定像素的顏色,若是圖像爲多通道,則返回一個元組,該方法執行起來比較慢。若是用戶須要使用Python處理圖像中大部分的數據,則可使用像素訪問對象(經過load()建立這個讀取和修改像素的對象,這個對象就如同一個二維列表)或者方法getdata()。pu印ixel(xy, color)可改變單個像素點的顏色。

4程序設計步驟

Python處理圖片切割

使用PIL中的crop()方法能夠從一幅圖像中裁剪指定區域。該區域使用四元組來指定,四元組的座標依次是(左、上、右、下)。PIL中指定座標系的左上角座標爲(0,0).

在本遊戲中,須要把圖片分割爲3列圖片塊,在上面的基礎上再指定不一樣的區域便可進行裁剪、保存。爲了方便使用,可編寫splitimage(src,rownum,colnum,dstpath)函數,實現將指定的src圖片文件分隔成rownumxcolnum數量的小圖片塊。

遊戲邏輯的實現

1.定義常量及加載圖片

2.圖像塊(拼塊)類

每一個圖像塊(拼塊)都是Square對象,具備draw功能,所以,可將本拼塊圖片繪製到Canvas上。orderID屬性是每一個圖像塊(拼塊)對應的編號。

3。初始化遊戲

random.shuffle(board)只能按行打亂二維列表,因此使用一維列表來實現打亂圖像塊的功能,再根據編號生成對應的圖像塊(拼塊)到board列表中。

4。繪製遊戲界面的各個元素

遊戲界面中還存在着各個元素,如黑框等,

5.鼠標事件

將單擊位置換算成拼圖板上的棋盤座標,若是單擊空位置,則全部圖像塊都不移動;不然依次檢查被單擊的當前圖像塊的上、下、左、右是否有空位置,若是有,就移動當前圖像塊。

6.判斷輸贏

判斷拼塊的編號是否有序,若是不是有序的,則返回False。

7.重置遊戲

8.「從新開始」按鈕的單擊事件

9.參考代碼:

運行結果:

相關文章
相關標籤/搜索