ホームページ  >  記事  >  バックエンド開発  >  Pythonでモザイク画を生成するにはどうすればよいですか?モザイク生成方法(詳細コード説明)

Pythonでモザイク画を生成するにはどうすればよいですか?モザイク生成方法(詳細コード説明)

青灯夜游
青灯夜游転載
2018-10-27 17:26:334444ブラウズ

この記事の内容はPythonでモザイク画を生成する方法を紹介するというものですか?モザイクを生成する方法(詳細コード説明)。一定の参考値があるので、困っている友人は参考にしていただければ幸いです。

モザイク画は、小さな絵で構成された大きな絵です。私たちのレンダリングでは、ズームインして詳細を確認してください。それぞれの部分は独立した絵です。組み合わせて大きな絵を形成すると、まるで絵を作ったように感じられます。モザイク画なのでモザイク画と呼ばれます。インターネットでいくつかのモザイクを見てかっこいいと思ったので、Python を使用して元の画像をモザイクに変換しました。

私たちのレンダリングは次のようになります:

Pythonでモザイク画を生成するにはどうすればよいですか?モザイク生成方法(詳細コード説明)

元の画像は次のようになります:

Pythonでモザイク画を生成するにはどうすればよいですか?モザイク生成方法(詳細コード説明)

実装の具体的なアイデアは次のとおりです。

ステップ 1: まず、全体像の中の小さな正方形の画像として使用される一連の画像を収集します。画像の数が多いほど、最終的に生成される画像の色は近づきます。

ステップ 2: 変換する画像を次のような小さな正方形の画像に分割します。

Pythonでモザイク画を生成するにはどうすればよいですか?モザイク生成方法(詳細コード説明)

ステップ 3: 小さな正方形のグリッド画像ごとに、それを置き換えます。画像セット内の最も近い画像を使用します。すべての小さな正方形が置き換えられた後、最終的なモザイクが生成されます。

簡単そうに思えますか?

具体的な実装手順を見てみましょう。いくつかのコア コードを次に示します。

私たちの画像コレクションは、images ディレクトリに保存されています。次のコードは、ディレクトリ内のすべての画像をロードし、それらを統一サイズに拡大縮小します。

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 関数のパラメータは、統一されたサイズです。 size、tile_row、tile_col はそれぞれ高さと幅に対応します。

次のコードは、変換する画像を分割します

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,:]

変換する画像を小さな正方形に分割します。tile_row と tile_col は、小さな正方形の高さと幅です。Roi storage を取得します。小さな正方形の画像データ。

以下は2枚の写真の類似度を計算する関数です

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は2枚の写真のデータです写真データは3次元のnumpy配列ですここで変換します3 次元配列を 1 次元に配列した後、2 つの間のユークリッド距離を比較します。最も類似した画像を見つけるには、画像セット内のすべての画像を走査し、最短距離の画像を見つけて、元の画像内の小さな正方形を置き換えるだけです。

最終的な効果を見てみましょう:

Pythonでモザイク画を生成するにはどうすればよいですか?モザイク生成方法(詳細コード説明)

拡大画像の部分的な詳細は次のとおりです:

Pythonでモザイク画を生成するにはどうすればよいですか?モザイク生成方法(詳細コード説明)

画質に満足できず、より洗練された画質が必要な場合は、セグメンテーション中に画像を小さな正方形に分割することを検討できますが、これによりプログラムの実行時間も長くなります。

以上がPythonでモザイク画を生成するにはどうすればよいですか?モザイク生成方法(詳細コード説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。