eightban's memo

残しておきたい記事をまとめてみました。このブログに書いてあるドキュメントやブログで配布しているファイルの使用によって発生するいかなる損害に対してもこのブログの管理者は責任を負いません。使用する場合は自己責任のもとに使用してください。

Python

画像の端にある物体を消す方法。

投稿日:

画像の外枠に接触している物体を消す方法です。消す時は透明にするようにしています

ライブラリーのインストール

pip install opencv-python
pip install opencv-contrib-python

プログラム

import os
import cv2
import numpy as np

def process_images(input_folder, output_folder):
    # 入力フォルダ内のすべてのファイルを処理
    for filename in os.listdir(input_folder):
        # ファイルパスを作成
        input_path = os.path.join(input_folder, filename)
        
        # 画像ファイルであることを確認
        if os.path.isfile(input_path) and filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            # 画像を読み込む
            img = cv2.imread(input_path)
            
            # 画像の高さと幅を取得
            height, width, _ = img.shape

            # 画像をグレースケールに変換
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

            # 閾値を設定して二値化
            ret, thresh = cv2.threshold(gray, 59, 255, 0)

            # 輪郭を検出
            contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

            # アルファチャンネルを追加
            img = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)

            # 輪郭を透明な色で塗りつぶす
            for contour in contours:
                # 輪郭が条件に一致するかをチェック
                if any([0 in contour[:, :, 0], width - 1 in contour[:, :, 0], 0 in contour[:, :, 1], height - 1 in contour[:, :, 1]]):
                    # 輪郭を外側に膨張させる
                    mask = np.zeros((height, width), dtype=np.uint8)
                    cv2.drawContours(mask, [contour], -1, (255), thickness=cv2.FILLED)
                    kernel = np.ones((3, 3), np.uint8)
                    mask = cv2.dilate(mask, kernel, iterations=1)
                    
                    # 輪郭を元のサイズにクリップ
                    img[:, :][mask == 255] = [0, 0, 0, 0]  # ここが修正箇所
            
            # 出力ファイルパスを作成
            output_path = os.path.join(output_folder, filename)

            # 結果を保存
            cv2.imwrite(output_path, img)

# 入力フォルダと出力フォルダを指定して関数を呼び出す例
input_folder = r"Y:\lin\tmp"
output_folder = r"Y:\lin\tmp2"
process_images(input_folder, output_folder)

-Python

Copyright© eightban's memo , 2024 All Rights Reserved Powered by STINGER.