画像の端にある物体を消す方法。
画像の外枠に接触している物体を消す方法です。消す時は透明にするようにしています
ライブラリーのインストール
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)
ディスカッション
コメント一覧
まだ、コメントがありません