Python實(shí)現(xiàn)多張圖片合成一張馬賽克圖片
前言
最近有網(wǎng)友私信我,問如何把多張圖片合成一張馬賽克圖片的樣子
說是女兒從出生到現(xiàn)在,所有的照片,大概有上百張,所以想使用這些照片合成一張,當(dāng)做生日禮物
那我們今天就用上次爬表情包的圖片來做一次馬賽克圖片,2萬張合成一張,想想就很激動(dòng)
圖片素材
4K高清原圖
開發(fā)環(huán)境
Python 3.6
Pycharm
實(shí)現(xiàn)代碼
先導(dǎo)入所需模塊
import cv2 import glob import argparse import numpy as np from tqdm import tqdm # 進(jìn)度條 from itertools import product # 迭代器
讀取圖片文件
def parsArgs(): parser = argparse.ArgumentParser('拼接馬賽克圖片') parser.add_argument('--targetpath', type=str, default='examples/3.jpg', help='目標(biāo)圖像路徑') parser.add_argument('--outputpath', type=str, default='output.jpg', help='輸出圖像的路徑') parser.add_argument('--sourcepath', type=str, default='sourceimages', help='用來拼接圖像的所有源圖像文件路徑') parser.add_argument('--blocksize', type=int, default=15, help='馬賽克快的大小') args = parser.parse_args() return args
讀取所有源圖片并計(jì)算對(duì)應(yīng)顏色平均值
def readSourceImages(sourcepath,blocksize): print('開始讀取圖像')
合法圖像列表
設(shè)置一個(gè)列表,存放符合要求的顏色圖像
sourceimages = []
平均顏色列表
avgcolors = []
遍歷
每遍歷一次,進(jìn)度條走一次
for path in tqdm(glob.glob("{}/*.jpg".format(sourcepath))): image = cv2.imread(path, cv2.IMREAD_COLOR) if image.shape[-1] != 3: continue # 縮放尺寸 image = cv2.resize(image, (blocksize, blocksize)) # 圖像顏色平均值 avgcolor = np.sum(np.sum(image, axis=0), axis=0) / (blocksize * blocksize) sourceimages.append(image) avgcolors.append(avgcolor) print('結(jié)束讀取') return sourceimages,np.array(avgcolors)
主函數(shù)
def main(args): targetimage = cv2.imread(args.targetpath) outputimage = np.zeros(targetimage.shape,np.uint8) # int8 int16 int32 int64 sourceimages,avgcolors = readSourceImages(args.sourcepath,args.blocksize) print('開始制作') for i, j in tqdm(product(range(int(targetimage.shape[1]/args.blocksize)), range(int(targetimage.shape[0]/args.blocksize)))): block = targetimage[j * args.blocksize: (j + 1) * args.blocksize, i * args.blocksize: (i + 1) * args.blocksize,:] avgcolor = np.sum(np.sum(block, axis=0), axis=0) / (args.blocksize * args.blocksize) distances = np.linalg.norm(avgcolor - avgcolors, axis=1) idx = np.argmin(distances) outputimage[j * args.blocksize: (j + 1) * args.blocksize, i * args.blocksize: (i + 1) * args.blocksize, :] = \ sourceimages[idx] cv2.imwrite(args.outputpath, outputimage) cv2.imshow('result', outputimage) print('制作完成')
模塊調(diào)用執(zhí)行
if __name__ == '__main__': # run main(parseArgs())
完整效果
到此這篇關(guān)于Python實(shí)現(xiàn)多張圖片合成一張馬賽克圖片的文章就介紹到這了,更多相關(guān)Python多張圖片合成馬賽克圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 讀取串口數(shù)據(jù),動(dòng)態(tài)繪圖的示例
今天小編就為大家分享一篇Python 讀取串口數(shù)據(jù),動(dòng)態(tài)繪圖的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python+Pygame實(shí)現(xiàn)神廟逃亡游戲
這篇文章主要為大家介紹了如何利用Python和Pygame動(dòng)畫制作一個(gè)神廟逃亡類似的小游戲。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下2022-05-05Python aiohttp百萬并發(fā)極限測試實(shí)例分析
這篇文章主要介紹了Python aiohttp百萬并發(fā)極限測試,結(jié)合實(shí)例形式分析了Python異步編程基于aiohttp客戶端高并發(fā)請(qǐng)求的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-10-10python 在threading中如何處理主進(jìn)程和子線程的關(guān)系
這篇文章主要介紹了python 在threading中如何處理主進(jìn)程和子線程的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python使用Tkinter實(shí)現(xiàn)轉(zhuǎn)盤抽獎(jiǎng)器的步驟詳解
這篇文章主要介紹了Python使用Tkinter實(shí)現(xiàn)轉(zhuǎn)盤抽獎(jiǎng)器,,本文分場景通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01python讀取excel數(shù)據(jù)繪制簡單曲線圖的完整步驟記錄
這篇文章主要給大家介紹了關(guān)于python讀取excel數(shù)據(jù)繪制簡單曲線圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10pycharm如何使用anaconda中的各種包(操作步驟)
這篇文章主要介紹了pycharm如何使用anaconda中的各種包,本文通過操作步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Tornado 多進(jìn)程實(shí)現(xiàn)分析詳解
這篇文章主要介紹了Tornado 多進(jìn)程實(shí)現(xiàn)分析詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01