ブログ一覧に戻る
ITトレンド

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

2024/5/29
画像処理の魔法使い、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がいかに強力か、そして画像処理の世界がいかに魅力的かを体験してみてください✨
時間を節約し、効率を向上させましょう!🌟

西村 力也

西村 力也

代表取締役

2002年からWeb制作・システム開発に従事。React、Next.js、TypeScriptを中心としたモダンなフロントエンド開発の専門家。AI検索最適化(AIO)の先駆者として、ChatGPT、Perplexity等のAI検索エンジン対応を推進。三重県津市を拠点に、東海地方の企業様のデジタル変革を支援しています。

React/Next.js開発TypeScriptAI検索最適化(AIO)SEO/MEO対策