Python
 Computer >> コンピューター >  >> プログラミング >> Python

OpenCVとPythonで画像内の水平線を検出して削除する方法

画像処理において、スキャン文書や表形式の画像に含まれる水平線(罫線)を除去したいケースはよくあります。本記事では、PythonのOpenCVライブラリを使用して、画像内の水平線を検出し、きれいに削除する手法を解説します。

水平線を削除する基本的な流れ

画像から水平線を取り除くには、以下の手順で処理を進めます。

  1. ローカルの画像ファイルを読み込む。
  2. 色空間を変換し、グレースケール画像にする。
  3. 各配列要素に対して固定レベルの閾値処理(大津の二値化)を適用する。
  4. モルフォロジー演算用に、指定したサイズと形状の構造要素(カーネル)を取得する。
  5. 高度なモルフォロジー変換を実行して線分を抽出する。
  6. 二値画像から輪郭を検出する。
  7. 異なるカーネルサイズでステップ4を再度行う。
  8. ステップ7で作成した新しいカーネルを使ってステップ5を繰り返す。
  9. 最終的な結果画像を表示する。

サンプルコード

import cv2

image = cv2.imread('input_image.png')
cv2.imshow('source_image', image)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 1))
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN,
horizontal_kernel, iterations=2)

cnts = cv2.findContours(detected_lines, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(image, [c], -1, (255, 255, 255), 2)

repair_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 6))

result = 255 - cv2.morphologyEx(255 - image, cv2.MORPH_CLOSE, repair_kernel,
iterations=1)

cv2.imshow('resultant image', result)
cv2.waitKey()
cv2.destroyAllWindows()

コードのポイント

  • 大津の二値化:cv2.THRESH_OTSU を組み合わせることで、閾値を自動的に決定できます。THRESH_BINARY_INV を指定しているため、線分が白(255)、背景が黒(0)になります。
  • 横長カーネル:cv2.getStructuringElement(cv2.MORPH_RECT, (25, 1)) は幅25ピクセル×高さ1ピクセルの矩形カーネルです。この形状により、水平方向の長い線だけが強調されます。
  • オープニング処理:MORPH_OPEN を適用することで、細かいノイズを除去しながら水平線のみを残します。
  • 輪郭描画による修復:検出した線分の輪郭を白色で塗りつぶし、その後クロージング処理で周囲の欠損を滑らかに補完しています。

実行結果

OpenCVとPythonで画像内の水平線を検出して削除する方法OpenCVとPythonで画像内の水平線を検出して削除する方法OpenCVとPythonで画像内の水平線を検出して削除する方法

出力画像を確認すると、元画像(source_image)に含まれていた水平線が、結果画像(resultant_image)では消えていることがわかります。罫線があった部分は自然に補完され、文字や図形などの本来のコンテンツはそのまま保持されています。

応用のヒント

垂直線を削除したい場合は、カーネルサイズを (1, 25) のように縦長に変更するだけで対応できます。また、線の太さや長さに応じてカーネルサイズや iterations の値を調整することで、より精度の高い除去が可能になります。帳票やスキャン文書の前処理など、さまざまな場面で活用できるテクニックなので、ぜひ試してみてください。

  1. PythonとOpenCVで実現するテンプレートマッチングの基本とマルチスケール対応

    テンプレートマッチングとは、実際の画像の中から、あらかじめ用意した小さな画像(テンプレート)と一致する部分を探し出す技術です。基本的にはパターンマッチングの一種であり、物体検出や顔認識など、さまざまなコンピュータビジョンのタスクの基礎となる手法です。PythonではOpenCVモジュールを使うことで、このマッチング処理を簡単に実装できます。本記事では、OpenCVのテンプレートマッチング機能を使った具体的な方法を解説します。OpenCVのインストールOpenCVの機能を利用するには、まずpipでライブラリをインストールします。sudo pip3 install opencv-python閾値(

  2. Python・OpenCVでヒストグラム平坦化を実装する方法|cv2.equalizeHist()の使い方

    ヒストグラム平坦化(Histogram Equalization)とは ヒストグラム平坦化は、画像処理において画像のヒストグラムを利用してコントラストを調整する手法です。 この手法は、多くの画像の全体的なコントラストを向上させる効果があります。特に、画像内の有効なデータが近いコントラスト値で表現されている場合に威力を発揮します。この調整を行うことで、輝度値がヒストグラム上により均等に分布するようになり、局所的にコントラストが低い領域でも高いコントラストを得られるようになります。 OpenCVの cv2.equalizeHist() 関数 OpenCVには、この処理を実行するための関数 cv2