Pythonでモザイク処理を実装する方法【OpenCV・PIL完全ガイド】
画像処理において、プライバシー保護や特殊効果のためにモザイク処理は欠かせない技術です。本記事では、Pythonを使ったモザイク処理の実装方法を、初心者から上級者まで理解できるよう徹底解説します。
モザイク処理とは
モザイク処理とは、画像の一部または全体を小さなブロックに分割し、各ブロック内の色を平均化または代表色で塗りつぶすことで、画像を粗く表示する技術です。主に以下の用途で使用されます:
- プライバシー保護(顔、個人情報の隠蔽)
- 芸術的効果の演出
- データ圧縮
- 画像の抽象化
必要なライブラリ
import cv2
import numpy as np
from PIL import Image
基本的なモザイク処理の実装
OpenCVを使った最小コード
import cv2
def mosaic_opencv(img, ratio=0.1):
h, w = img.shape[:2]
img = cv2.resize(img, (int(w*ratio), int(h*ratio)))
return cv2.resize(img, (w, h), interpolation=cv2.INTER_NEAREST)
# 使用例
img = cv2.imread('input.jpg')
result = mosaic_opencv(img, 0.05)
cv2.imwrite('mosaic_output.jpg', result)
PILを使った実装
from PIL import Image
def mosaic_pil(img_path, block_size=10):
img = Image.open(img_path)
img = img.resize((img.width//block_size, img.height//block_size))
return img.resize((img.width*block_size, img.height*block_size), Image.NEAREST)
# 使用例
result = mosaic_pil('input.jpg', 20)
result.save('mosaic_pil.jpg')
高度なモザイク処理
ブロック単位でのモザイク処理
import cv2
import numpy as np
def block_mosaic(img, block_size=10):
h, w = img.shape[:2]
for y in range(0, h, block_size):
for x in range(0, w, block_size):
roi = img[y:y+block_size, x:x+block_size]
color = np.mean(roi, axis=(0,1)).astype(int)
img[y:y+block_size, x:x+block_size] = color
return img
円形モザイク処理
import cv2
import numpy as np
def circular_mosaic(img, radius=10):
h, w = img.shape[:2]
for y in range(0, h, radius*2):
for x in range(0, w, radius*2):
center = (x+radius, y+radius)
mask = np.zeros((h, w), dtype=np.uint8)
cv2.circle(mask, center, radius, 255, -1)
mean_color = cv2.mean(img, mask=mask)[:3]
cv2.circle(img, center, radius, mean_color, -1)
return img
顔検出と組み合わせたモザイク処理
import cv2
def face_mosaic(img_path):
img = cv2.imread(img_path)
cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = cascade.detectMultiScale(img, 1.1, 4)
for (x, y, w, h) in faces:
face_roi = img[y:y+h, x:x+w]
face_roi = cv2.resize(face_roi, (w//10, h//10))
img[y:y+h, x:x+w] = cv2.resize(face_roi, (w, h), interpolation=cv2.INTER_NEAREST)
return img
パフォーマンス最適化
NumPyを活用した高速化
import numpy as np
def fast_mosaic(img, block_size=10):
h, w = img.shape[:2]
# ブロックサイズに合わせて画像をリシェイプ
img_blocks = img[:h//block_size*block_size, :w//block_size*block_size]
img_blocks = img_blocks.reshape(h//block_size, block_size, w//block_size, block_size, 3)
# 各ブロックの平均を計算
mosaic_img = np.mean(img_blocks, axis=(1, 3)).astype(np.uint8)
# 元のサイズに戻す
return np.repeat(np.repeat(mosaic_img, block_size, axis=0), block_size, axis=1)
実用的な応用例
Webカメラでリアルタイムモザイク
import cv2
def realtime_mosaic():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
mosaic_frame = mosaic_opencv(frame, 0.1)
cv2.imshow('Mosaic', mosaic_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
グラデーションモザイク
import cv2
import numpy as np
def gradient_mosaic(img, max_block=50, min_block=5):
h, w = img.shape[:2]
result = img.copy()
for y in range(0, h, min_block):
# Y座標に基づいてブロックサイズを決定
progress = y / h
block_size = int(min_block + (max_block - min_block) * progress)
for x in range(0, w, block_size):
roi = img[y:min(y+block_size, h), x:min(x+block_size, w)]
if roi.size > 0:
mean_color = np.mean(roi, axis=(0,1)).astype(int)
result[y:min(y+block_size, h), x:min(x+block_size, w)] = mean_color
return result
エラーハンドリング
def safe_mosaic(img_path, block_size=10):
try:
img = cv2.imread(img_path)
if img is None:
raise ValueError("画像を読み込めませんでした")
if block_size <= 0:
raise ValueError("ブロックサイズは正の整数である必要があります")
return mosaic_opencv(img, 1/block_size)
except Exception as e:
print(f"エラーが発生しました: {e}")
return None
まとめ
Pythonでのモザイク処理は、OpenCVやPILを使うことで簡単に実装できます。基本的な縮小→拡大の手法から、ブロック単位での処理、顔検出との組み合わせまで、様々な手法があります。
用途に応じて適切な手法を選択し、パフォーマンスとのバランスを考慮して実装することが重要です。特にリアルタイム処理では、NumPyの活用やアルゴリズムの最適化が効果的です。
参考文献
- OpenCV公式ドキュメント
- PIL/Pillow公式ドキュメント
- NumPy公式ドキュメント
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座


