1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

がちもとさんAdvent Calendar 2023

Day 14

透明に塗りつぶすアプリつくーる(Python、OpenCV)

Last updated at Posted at 2023-12-13

はじめに

がちもとさんアドベントカレンダー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()

実行結果

保存したマスク画像はこちらです。

mask.png

お疲れさまでした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?