前言
今天利用昨天下載的表情包,那就用它們來拼一波馬賽克圖片,好了廢話不多說,讓我們愉快地開始吧~
開發工具
Python版本: 3.6.4
相關模塊:
opencv-python模塊;
numpy模塊;
tqdm模塊;
argparse模塊;
以及一些python自帶的模塊,
環境搭建
安裝Python并添加到環境變數,pip安裝需要的相關模塊即可,
原理簡介
原理其實很簡單,先讀取所有下載好的表情包圖片(具體內容見公眾號昨天發的推文):

并調整影像大小為指定的馬賽克塊大小,最后計算調整后的圖片的顏色均值(RGB分開算):
'''讀取所有源圖片并計算對應的顏色平均值'''
def readSourceImages(sourcepath, blocksize):
print('Start to read source images')
sourceimages = []
avgcolors = []
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('Finish reading source images')
return sourceimages, np.array(avgcolors)
接著,從左到右,從上到下遍歷影像(每次截取馬賽克塊大小),原理類似這樣:

然后為每個馬賽克塊尋找一個和其顏色最接近的表情包圖片貼到對應的位置就ok啦,代碼實作如下:
'''主函式'''
def main(args):
targetimage = cv2.imread(args.targetpath)
outputimage = np.zeros(targetimage.shape, np.uint8)
sourceimages, avgcolors = readSourceImages(args.sourcepath, args.blocksize)
print('Start to make photomosaic')
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('Finish making photomosaic, result saved in %s' % args.outputpath)
文章到這里就結束了,感謝你的觀看,Python影像特效系列暫停更新,下個系列將分享Python自動玩小游戲,
為了感謝讀者們,我想把我最近收藏的一些編程干貨分享給大家,回饋每一個讀者,希望能幫到你們,
干貨主要有:
① 2000多本Python電子書(主流和經典的書籍應該都有了)
② Python標準庫資料(最全中文版)
③ 專案原始碼(四五十個有趣且經典的練手專案及原始碼)
④ Python基礎入門、爬蟲、web開發、大資料分析方面的視頻(適合小白學習)
⑤ Python學習路線圖(告別不入流的學習)
All done~私信獲取完整源代碼,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297236.html
標籤:其他
