您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)Python中怎么生成一個馬賽克畫,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
import re
import os
import cv2
import numpy as np
from tqdm import tqdm
IMG_DIR = "images"
def load_all_images(tile_row, tile_col):
img_dir = IMG_DIR
filenames = os.listdir(img_dir)
result = []
print(len(filenames))
for filename in tqdm(filenames):
if not re.search(".jpg", filename, re.I):
continue
try:
filepath = os.path.join(img_dir, filename)
im = cv2.imread(filepath)
row = im.shape[0]
col = im.shape[1]
im = resize(im, tile_row, tile_col)
result.append(np.array(im))
except Exception as e:
msg = "error with {} - {}".format(filepath, str(e))
print(msg)
return np.array(result, dtype=np.uint8)
這里load_all_images函數(shù)的參數(shù)就是統(tǒng)一后的尺寸,tile_row和tile_col分別對應(yīng)高和寬。
下面的代碼對要轉(zhuǎn)換的圖片進行分割
img = cv2.imread(infile)
tile_row, tile_col = get_tile_row_col(img.shape)
for row in range(0, img_shape[0], tile_row):
for col in range(0, img_shape[1], tile_col):
roi = img[row:row+tile_row,col:col+tile_col,:]
我們將要轉(zhuǎn)換的圖片分割成一個個小方格,tile_row和tile_col是小方格的高和寬,roi存取小方格中的圖片數(shù)據(jù)。
下面是計算兩張圖片相似度的函數(shù)
from scipy.spatial.distance import euclidean
def img_distance(im1, im2):
if im1.shape != im2.shape:
msg = "shapes are different {} {}".format(im1.shape, im2.shape)
raise Exception(msg)
array1 = im1.flatten()
array2 = im2.flatten()
dist = euclidean(array1, array2)
return dist
im1和im2是兩張圖片的數(shù)據(jù),圖片數(shù)據(jù)是一個三維的numpy數(shù)組,這里我們將三維數(shù)組轉(zhuǎn)換成一維數(shù)組后,比較兩者的歐式距離。之后要找出最相似的圖片,只需遍歷圖片集中所有的圖片,找到距離最短的那張圖片,去替換原圖中的小方格就可以了。
關(guān)于Python中怎么生成一個馬賽克畫就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。