はじめに
がちもとさんアドベントカレンダー14日目の記事です。
昨日は、OpenAIのDALLE2を用いて透明に塗りつぶした領域を画像生成でインペイントしました。今日は、透明に塗りつぶすアプリを作っていきます。
開発環境
- Windows 11 PC
- Python 3.11
導入
1.ライブラリのインストール
pip install opencv-python
2.プログラムを作成
image_paint.py
import cv2
import numpy as np
# マウスが押されているかどうかのフラグ
drawing = False
# ブラシの初期サイズ
brush_size = 50
# ブラシのプレビューを表示するための一時的な画像
temp_image = None
# ブラシサイズを更新する関数
def update_brush_size(val):
global brush_size
brush_size = val
# マウスコールバック関数
def draw_brush(event, x, y, flags, param):
global temp_image, drawing, brush_size
if event == cv2.EVENT_MOUSEMOVE or event == cv2.EVENT_LBUTTONDOWN or event == cv2.EVENT_LBUTTONUP:
# 一時的な画像を元の画像のコピーで更新
temp_image = image.copy()
# ブラシのプレビューを表示
cv2.circle(temp_image, (x, y), brush_size, (0, 0, 0), 3)
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
if drawing:
# ブラシサイズ分の範囲を透明にする
cv2.circle(image, (x, y), brush_size, (0, 0, 0, 0), -1)
if event == cv2.EVENT_LBUTTONUP:
drawing = False
# 画像を読み込む
image_path = 'woman-2003647_1280.jpg' # 画像のパスを指定
image = cv2.imread(image_path, cv2.IMREAD_UNCHANGED)
# アルファチャンネルを追加(もし存在しなければ)
if image.shape[2] == 3:
# RGBからRGBAに変換
image = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA)
temp_image = image.copy()
# OpenCVウィンドウを作成し、マウスコールバックを設定
cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
cv2.createTrackbar('Brush Size', 'Image', brush_size, 100, update_brush_size)
cv2.setMouseCallback('Image', draw_brush)
while True:
# ブラシのプレビューを表示するために一時的な画像を使用
cv2.imshow('Image', temp_image if not drawing else image)
# キー入力を待つ
key = cv2.waitKey(1) & 0xFF
# 's'キーで画像を保存
if key == ord('s'):
save_path = 'mask.png' # 保存するファイル名
cv2.imwrite(save_path, image)
print(f"Image saved as {save_path}")
# 'q'キーで終了
if key == ord('q'):
break
# すべてのウィンドウを閉じる
cv2.destroyAllWindows()
実行結果
保存したマスク画像はこちらです。
お疲れさまでした。