02.07 numpy還能這樣用

之前無聊在刷視頻的時候看到這麼一個有意思的視頻(現在視頻找不到,忘記關鍵字了= =),視頻的內容大概是這樣的:一張狗狗的側臉照片,經過碎紙機,橫的切成若干條,並且沒有打亂,隨後隔條分成了兩份,然後把這兩份各自拼接在一起,出現了兩張狗狗的圖片(B圖和C圖)。

如下圖:把A圖分成了B和C兩張圖片A圖

numpy還能這樣用

numpy還能這樣用

B圖

numpy還能這樣用

numpy還能這樣用

C圖

numpy還能這樣用

numpy還能這樣用

如上圖A,B,C,圖片上的狗狗其實是同一個,利用原圖A,把A等分成若干份,分別給B,C,然後再次拼接在一起,於是形成了B,C兩張圖片。


如何實現?

想實現視頻中的效果,你可以手工做,先打印那麼一張狗狗的圖片,然後裁剪,拼裝,但是很麻煩而且要有耐心。會Numpy圖像處理的話,我們就可以用計算機的方式來實現這個現象。

Numpy對圖像的處理實際上就是對ndarray的處理。圖像和ndarray又有什麼關係呢?圖像是可以用ndarray數組來表示。如圖我們可以用plt.imread()讀取一張圖片的數據,返回的就是這張圖片的ndarray數組。

a.shape()查看數組的形狀其中(347,500,3), 500代表圖片的長度,347代表圖片的寬度,3代表RGB(通道數,有些圖片格式是3通道,有些圖片格式是4通道)。

所以我們可以將一張圖片看作一個ndarray,而numpy庫可以對ndarry進行處理,主要操作就是對數組的拆分,以及數組的拼接。

準備工作:首先從某網站上下載了一張狗狗的照片= =。

numpy還能這樣用

我們用numpy來處理圖像。注:使用numpy庫來對圖像進行處理。這裡我們使用matplotlib.pyplot的相關方法來輔助。

主要用到的函數方法:

plt.imread:讀取圖像,返回ndarray的數組。

plt.imshow:顯示圖像。

plt.imsave:保存圖像。

np.split:數組的分割,分割圖像。

np.concatenate:數組的拼接,拼接圖像。ps:imread方法默認只能處理png格式的圖像,如果需要處理其他格式的圖像,需要安裝pillow庫。這裡下載的圖片是jpg格式的,所以在讀取的時候會報錯。偷懶一下,用ps打開重新用png格式保存了一下,另外直接重命名原圖為png也是不行的哦。。。

第一步:導入圖片

<code>
# 導入庫
Import numpy as np
Import matplotlib.pyplot as plt
# 讀取圖像數據
a = plt.imread(u"狗狗.png")
/<code>

第二步:對圖像進行分割

<code>
#讀取圖像的width,方便對其進行拆分
width = a.shape[1]
#將圖片豎著切分成若干份:將數組以列來進行切分(axis = 1),分成兩組
li = np.split(a, range(10, width,10), axis=1)
#這裡我們將圖片分割成若干寬度為10的長條
li1 = li[::2]

#利用切片操作,設置步長為2,相當於從第一條開始,隔條取出,即取出奇數的圖片
li2 = li[1::2]
#利用切片操作,設置步長為2,相當於從第二條開始,隔條取出,即取出偶數的圖片
/<code>

第三步:合併圖像:將數組合並在一起

<code># 把數組合並,相當於把第一個容器中的圖片拼接起來。
a1 = np.concatenate(li1,axis=1)
# 把數組合並,相當於把第二個容器中的圖片拼接起來。
a2 = np.concatenate(li2,axis=1)
/<code>

第四步:顯示圖像(放在一起顯示,可以對原圖和產生的兩張圖片進行比較)

<code>
Fig, ax = plt.subplots(3)
Fig , set_size_inches(10, 10)
#原圖
ax[0].imshow(a)
#圖1
ax[ 1].imshow(a1)
#圖2
ax[2].imshow(a2)
plt.tight_layout()
/<code>

最終的結果如圖:分割的寬度越小,拼接出來的圖片內越真實

numpy還能這樣用

切分寬度為5

numpy還能這樣用

切分寬度為20

大家可以試著切分更多的條數,或者打亂順序來拼接圖片來看看最終的效果,是不是很神奇呢= =。

這個技術可以運用在哪兒呢?

在圖片原創欺騙上可能有些用途,其他的用途還沒想到。


分享到:


相關文章: