• EXA blog
  • 画像処理の魔法使い、PythonとOpenCVの冒険

2024
ITトレンド技術

画像処理の魔法使い、PythonとOpenCVの冒険

画像処理の魔法使い、PythonとOpenCVの冒険にご招待します!🧙‍♂️✨

今回は過去案件にて使用した、実際のソースコードをご紹介します。
お客様からのご依頼は、数百枚のスキャニングした画像データをページに一覧表示したいというものでした。
元画像がスキャニングデータであるため、画像によっては傾きが異なり、本来は1枚ずつチェックし、画像編集ソフトを使って回転させる必要があります。

PythonのOpenCVライブラリを活用することで、画像を自動認識し、傾きを補正することが可能です。
また、リサイズとトリミングを実施し、中央に再配置することで大幅な作業効率化につながります。

ソースコードについては以下になります。
事前にPythonが動作する環境を用意しておきます。

まずは使用するライブラリを読み込みます


import cv2
import os
import numpy as np

画像補正用の命令を記述します

  • 出力先のディレクトリがなければ作成
  • 入力用ディレクトリに格納した複数の画像を読み込む
  • 元画像の共通して不要な部分を削除
  • 元画像に共通して含まれる外枠の四角形の角度の修正(10度以内の傾きが対象)
  • 画像のリサイズ
  • 画像を中央に再配置


def resize_and_center_images(input_folder, output_folder, desired_size):
if not os.path.exists(output_folder):
os.makedirs(output_folder)

for filename in os.listdir(input_folder):
    if filename.endswith((".png", ".jpg", ".jpeg")):
        img_path = os.path.join(input_folder, filename)
        img = cv2.imread(img_path)
        img = img[:, 190:]

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        _, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)
        contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        if contours:
            cnt = max(contours, key=cv2.contourArea)
            rect = cv2.minAreaRect(cnt)
            angle = rect[2]
            if angle < -10:
                angle = 90 + angle
            elif angle > 10:
                angle = angle - 90
            (h, w) = img.shape[:2]
            center = (w // 2, h // 2)
            M = cv2.getRotationMatrix2D(center, angle, 1.0)
            corrected_img = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

            scale = min(desired_size / h, desired_size / w)
            new_h, new_w = int(h * scale), int(w * scale)
            resized_img = cv2.resize(corrected_img, (new_w, new_h))

            top = (desired_size - new_h) // 2
            bottom = desired_size - new_h - top
            left = (desired_size - new_w) // 2
            right = desired_size - new_w - left

            centered_img = cv2.copyMakeBorder(resized_img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[255, 255, 255])

            output_path = os.path.join(output_folder, filename)
            cv2.imwrite(output_path, centered_img)

input_folder = 'pathto/input'
output_folder = 'pathto/output'
desired_size = 800

resize_and_center_images(input_folder, output_folder, desired_size)

Pythonを利用すれば、大量の画像処理も、画像解析ライブラリを活用して短時間で実施することができます。
他にも同じ操作を繰り返す作業や、データの収集・分析も可能です。

PythonとOpenCVがいかに強力か、そして画像処理の世界がいかに魅力的かを体験してみてください✨
時間を節約し、効率を向上させましょう!🌟




TOPへ