numpy拼接_巧用numpy切分图片
昨晚發(fā)了接受投稿文章,昨晚就有讀者積極來(lái)文章啦,幾輪郵件交流了修改意見(jiàn)后,今天就發(fā)布啦,這篇的稿費(fèi)是300。
之前無(wú)聊在刷視頻的時(shí)候看到這么一個(gè)有意思的視頻(現(xiàn)在視頻找不到,忘記關(guān)鍵字了= =),視頻的內(nèi)容大概是這樣的:一張狗狗的側(cè)臉照片,經(jīng)過(guò)碎紙機(jī),橫的切成若干條,并且沒(méi)有打亂,隨后隔條分成了兩份,然后把這兩份各自拼接在一起,出現(xiàn)了兩張狗狗的圖片(B圖和C圖)。
如下圖:把A圖分成了B和C兩張圖片
A圖
B圖
C圖
如上圖A,B,C,圖片上的狗狗其實(shí)是同一個(gè),利用原圖A,把A等分成若干份,分別給B,C,然后再次拼接在一起,于是形成了B,C兩張圖片。
如何實(shí)現(xiàn)?
想實(shí)現(xiàn)視頻中的效果,你可以手工做,先打印那么一張狗狗的圖片,然后裁剪,拼裝,但是很麻煩而且要有耐心。會(huì)Numpy圖像處理的話(huà),我們就可以用計(jì)算機(jī)的方式來(lái)實(shí)現(xiàn)這個(gè)現(xiàn)象。
Numpy對(duì)圖像的處理實(shí)際上就是對(duì)ndarray的處理。圖像和ndarray又有什么關(guān)系呢?圖像是可以用ndarray數(shù)組來(lái)表示。如圖我們可以用plt.imread()讀取一張圖片的數(shù)據(jù),返回的就是這張圖片的ndarray數(shù)組。
a.shape()查看數(shù)組的形狀
其中(347,500,3), 500代表圖片的長(zhǎng)度,347代表圖片的寬度,3代表RGB(通道數(shù),有些圖片格式是3通道,有些圖片格式是4通道)。
所以我們可以將一張圖片看作一個(gè)ndarray,而numpy庫(kù)可以對(duì)ndarry進(jìn)行處理,主要操作就是對(duì)數(shù)組的拆分,以及數(shù)組的拼接。
準(zhǔn)備工作:首先從某網(wǎng)站上下載了一張狗狗的照片= =。
我們用numpy來(lái)處理圖像。注:使用numpy庫(kù)來(lái)對(duì)圖像進(jìn)行處理。這里我們使用matplotlib.pyplot的相關(guān)方法來(lái)輔助。
主要用到的函數(shù)方法:
plt.imread:讀取圖像,返回ndarray的數(shù)組。
plt.imshow:顯示圖像。
plt.imsave:保存圖像。
np.split:數(shù)組的分割,分割圖像。
np.concatenate:數(shù)組的拼接,拼接圖像。
ps:imread方法默認(rèn)只能處理png格式的圖像,如果需要處理其他格式的圖像,需要安裝pillow庫(kù)。這里下載的圖片是jpg格式的,所以在讀取的時(shí)候會(huì)報(bào)錯(cuò)。偷懶一下,用ps打開(kāi)重新用png格式保存了一下,另外直接重命名原圖為png也是不行的哦。。。
第一步:導(dǎo)入圖片
# 導(dǎo)入庫(kù) Import numpy as np Import matplotlib.pyplot as plt # 讀取圖像數(shù)據(jù) a = plt.imread(u"狗狗.png")第二步:對(duì)圖像進(jìn)行分割
#讀取圖像的width,方便對(duì)其進(jìn)行拆分 width = a.shape[1] #將圖片豎著切分成若干份:將數(shù)組以列來(lái)進(jìn)行切分(axis = 1),分成兩組 li = np.split(a, range(10, width,10), axis=1) #這里我們將圖片分割成若干寬度為10的長(zhǎng)條 li1 = li[::2] #利用切片操作,設(shè)置步長(zhǎng)為2,相當(dāng)于從第一條開(kāi)始,隔條取出,即取出奇數(shù)的圖片 li2 = li[1::2] #利用切片操作,設(shè)置步長(zhǎng)為2,相當(dāng)于從第二條開(kāi)始,隔條取出,即取出偶數(shù)的圖片第三步:合并圖像:將數(shù)組合并在一起
# 把數(shù)組合并,相當(dāng)于把第一個(gè)容器中的圖片拼接起來(lái)。 a1 = np.concatenate(li1,axis=1) # 把數(shù)組合并,相當(dāng)于把第二個(gè)容器中的圖片拼接起來(lái)。 a2 = np.concatenate(li2,axis=1)第四步:顯示圖像(放在一起顯示,可以對(duì)原圖和產(chǎn)生的兩張圖片進(jìn)行比較)
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()最終的結(jié)果如圖:分割的寬度越小,拼接出來(lái)的圖片內(nèi)越真實(shí)
切分寬度為5
切分寬度為20
大家可以試著切分更多的條數(shù),或者打亂順序來(lái)拼接圖片來(lái)看看最終的效果,是不是很神奇呢= =。
這個(gè)技術(shù)可以運(yùn)用在哪兒呢?
在圖片原創(chuàng)欺騙上可能有些用途,其他的用途還沒(méi)想到。
本文由猿人學(xué)Python原創(chuàng)
首發(fā)與猿人學(xué)Python公眾和猿人學(xué)網(wǎng)站
巧用numpy切分圖片
總結(jié)
以上是生活随笔為你收集整理的numpy拼接_巧用numpy切分图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中@staticmethod
- 下一篇: python如何开启多线程_Python