溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何使用Python制作縮放自如的圣誕老人

發(fā)布時(shí)間:2020-12-25 10:34:38 來(lái)源:菜鳥(niǎo)學(xué)python 閱讀:132 作者:栢白 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享的是如何使用Python制作縮放自如的圣誕老人,相信很多人都不太了解,為了讓大家更加了解,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會(huì)有所收獲的哦。

今天的主題是為大家展示如何用python做一個(gè)不斷變大的圣誕老人,就像西游記中能夠隨意變幻大小的神仙妖怪那樣,算是送給大家的小禮物,先上個(gè)圖吧!

如何使用Python制作縮放自如的圣誕老人

思路要點(diǎn):

  • 通過(guò)縮放獲取等比大小的一組圖片

  • 將上述圖片疊加到固定大小的底圖中

  • 按順序組合圖片生成動(dòng)圖

1、圖片縮放

本篇文章的大部分工作都是基于opencv實(shí)現(xiàn),而opencv進(jìn)行圖片縮放是極其容易的,不過(guò)這次我們要生成的是一組等比縮放的圖片,所以在cv2.resize方法的使用上可能跟以往略有出入,先來(lái)看函數(shù)原型:

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

其中src是原圖片,dsize是目標(biāo)圖片大小,當(dāng)dsize為0的時(shí)候,我們就可以通過(guò)fx和fy兩個(gè)參數(shù)來(lái)分別設(shè)置水平軸和垂直軸方向的縮放比例了。這樣說(shuō)可能有些抽象,我們舉個(gè)例子來(lái)說(shuō)明:

for i in range(1, 40, 1): 
 img = cv2.resize(image, (0, 0), fx=i/30, fy=i/30) 
 cv2.imwrite(str(i)+'.png', img)

運(yùn)行上面這段代碼會(huì)生成39張不同比例的圖片,目標(biāo)圖片的大小由縮放比例fx和fy來(lái)控制,最小的一幅圖邊長(zhǎng)是原圖的1/30,最大的圖片邊長(zhǎng)是原圖的1.3倍(下圖):

如何使用Python制作縮放自如的圣誕老人

既然等比縮放的圖片有了,是不是可以選定一個(gè)坐標(biāo)原點(diǎn),直接合成動(dòng)圖呢?答案是不行,因?yàn)槌R?guī)的動(dòng)圖生成方法要求素材圖片必須是相同的尺寸(像素),下面我們就來(lái)著重解決這一問(wèn)題。

2、底圖疊加

python中實(shí)現(xiàn)兩幅圖片疊加的辦法有很多,但是他們都存在缺陷——要么疊加的圖片必須是相同大小,要么難以控制圖片疊加的具體位置。對(duì)此,小編采取的辦法是在兩幅圖之間進(jìn)行“像素級(jí)”的替換。

1).生成底圖

待疊加的圖片中,上層圖片就使用剛才獲取到的一系列等比縮放圖,下層圖片我們就生成一張固定大小的空白圖片。需要注意,這里生成的空白圖片必須大于最大的一幅縮放圖。

生成空白底圖分兩步完成,第一步生成固定大小(垂直軸和水平軸的長(zhǎng)度)的二維數(shù)組;第二步使用cv2.cvtColor進(jìn)行顏色空間變換。代碼如下:

blank = np.ones((blankh, blankw), dtype=np.uint8) * 255 
ret = cv2.cvtColor(blank, cv2.COLOR_GRAY2BGR)

其實(shí)上面代碼中的ret本質(zhì)上是一個(gè)三維數(shù)組,我們可以把它打印出來(lái)查看(下圖),但是通過(guò)cv2.imshow方法展示出來(lái)就是一張空白圖片了。這其中涉及一些較為底層的內(nèi)容,大家了解就好,文中不再贅述。

如何使用Python制作縮放自如的圣誕老人

2).像素替換

正如剛才所說(shuō),opencv中的一幅圖其實(shí)是一個(gè)三維數(shù)組,其實(shí)也可以把它看作是二維數(shù)組,數(shù)組中的

每個(gè)元素是形如 [255, 255, 255] 的列表,其中存放的是圖片每個(gè)像素的顏色參數(shù)。也就是說(shuō),如果我們想實(shí)現(xiàn)一幅圖片疊加到另一幅圖片這樣的視覺(jué)效果,可以對(duì)被疊加圖片對(duì)應(yīng)位置的

像素進(jìn)行替換賦值。代碼形式如下圖所示,其中i和j分別為圖片在垂直方向和水平方向的坐標(biāo)。

ret[i, j, 0] = image[i, j, 0] 
ret[i, j, 1] = image[i, j, 1] 
ret[i, j, 2] = image[i, j, 2]

對(duì)一幅圖片而言,坐標(biāo)原點(diǎn)是在左上角(下圖所示)。此外,為了保證最終得到動(dòng)圖的效果,不能簡(jiǎn)單的將圖片以坐標(biāo)原點(diǎn)為基準(zhǔn)進(jìn)行疊加,比較好的辦法是把疊加原點(diǎn)設(shè)在底圖下邊緣的中心位置。

如何使用Python制作縮放自如的圣誕老人

原理搞清楚后就可以開(kāi)始圖片疊加操作了,在此期間需要進(jìn)行一些像素對(duì)應(yīng)位置的計(jì)算,雖然稍微有點(diǎn)繞但是并不復(fù)雜,詳細(xì)的轉(zhuǎn)化公式就不寫(xiě)了,我們直接看代碼:

如何使用Python制作縮放自如的圣誕老人

上面代碼中的image是已經(jīng)縮放完畢的圣誕老人圖片,blankh和blankw分別是空白圖片的高度和寬度,這個(gè)尺寸可以根據(jù)需求自行設(shè)置。

下圖展示的是一幅縮放比例1/2左右的圖片和底圖疊加后的效果,為了觀察方便,我給圖片加了一個(gè)邊框。

如何使用Python制作縮放自如的圣誕老人

3、生成動(dòng)圖

之前我們已經(jīng)解決了單幅圖片與底圖的疊加,為了準(zhǔn)備合成動(dòng)圖所需素材,還要對(duì)多個(gè)等比縮放的圖片進(jìn)行底圖疊加操作。縮放比例間隔越小、準(zhǔn)備的圖片素材越多,生成的動(dòng)圖也就越平滑。

當(dāng)然,動(dòng)圖的效果如何還要綜合考慮多個(gè)因素,這里小編還是采用39幅圖片組合動(dòng)圖。其中最小的圖形高度是原圖的1/30,最大的圖形高度是原圖的1.3倍。與底圖疊加后的圖片就是下面這個(gè)樣子。

如何使用Python制作縮放自如的圣誕老人

下面來(lái)說(shuō)說(shuō)動(dòng)圖的合成,將多個(gè)相同尺寸的圖片合成動(dòng)圖可以使用imageio這個(gè)庫(kù)來(lái)實(shí)現(xiàn),核心代碼只有一條:

imageio.mimwrite('目標(biāo)文件名稱(chēng).gif', gifList, duration=0.15)

其中第一個(gè)參數(shù)是git目標(biāo)文件名稱(chēng);gifList是一組列待合成的圖片,也就是上面圖片中展示的那些;最后一個(gè)參數(shù)duration表示畫(huà)面切換間隔,單位為秒。

現(xiàn)在通過(guò)下面這段代碼進(jìn)行動(dòng)圖合成。

file_path = 'pic' 
imgList = os.listdir(file_path) 
imgList = ['pic/'+img for img in imgList] 
gifList = [imageio.imread(img) for img in imgList] 
imageio.mimwrite('gif.gif', gifList, duration=0.15)

來(lái)看合成后的動(dòng)圖效果(下圖),仔細(xì)看看好像有點(diǎn)問(wèn)題,怎么圖中的圣誕老人忽大忽小?這跟我們預(yù)想的不一樣啊。

如何使用Python制作縮放自如的圣誕老人

其實(shí)這個(gè)問(wèn)題是出在合成圖片的順序上,我們嘗試打印上面代碼中的imgList變量,結(jié)果如下:

如何使用Python制作縮放自如的圣誕老人

可以看到,素材圖片并不是按照我們預(yù)想的順序排序。這在python的文件處理中也算是個(gè)比較常見(jiàn)的問(wèn)題,解決方案之一是可以按照?qǐng)D片的創(chuàng)建時(shí)間排序,具體操作是在上面的第二行代碼之后插入一條語(yǔ)句:

imgList = sorted(imgList,key=lambda x: os.path.getmtime(os.path.join(file_path, x)))

現(xiàn)在再次進(jìn)行動(dòng)圖合成,就可以實(shí)現(xiàn)文章開(kāi)頭的效果了。

當(dāng)然了,這種動(dòng)圖制作方法不僅限于圣誕老人,任何圖片理論上都是可以的。比如說(shuō),我們還可以做一棵不斷長(zhǎng)大的圣誕樹(shù)!

關(guān)于如何使用Python制作縮放自如的圣誕老人就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的參考價(jià)值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI