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