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

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

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

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

Posted by eightban