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

【Python×OpenCV】画像の収縮(エロージョン)と膨張(ダイレーション)の基本を解説

本記事では、PythonのOpenCVモジュールを使って、エロージョン(収縮)ダイレーション(膨張)といったモルフォロジー演算(形態学的処理)を実行する方法を解説します。

OpenCVはコンピュータビジョン向けに設計されたオープンソースのライブラリで、もともとはIntelによって開発されました。BSDライセンスのもとで誰でも無料で利用できます。

OpenCVの機能を使うには、まずpipでインストールしておきましょう。

sudo pip3 install opencv-python

エロージョン(収縮)とは?仕組みを解説

エロージョンは、前景オブジェクトの境界を削り取っていく処理です。画像内の小さな白いノイズを除去したり、くっついてしまった2つのオブジェクトを分離したい場合などに活用されます。

  • まずカーネル(構造要素)を作成します。カーネルは行列であり、3×3、5×5、7×7のように奇数サイズで指定します。

  • 画像上のある1ピクセルに着目したとき、カーネルが覆う範囲のすべてのピクセルが1である場合にのみ、そのピクセルは1のまま残ります。それ以外の場合は削除(侵食)されます。

  • このため、オブジェクトの境界付近にあるピクセルはすべて取り除かれていきます。

  • 結果として、前景オブジェクトの厚みが減少していきます。

ダイレーション(膨張)とは?仕組みを解説

ダイレーションは、オブジェクトの領域を拡大していく処理です。エロージョンは白いノイズを除去できる一方で、画像自体も縮小させてしまうという欠点があります。そこで、エロージョンの後にダイレーションを組み合わせることで、より効果的なノイズ除去が実現できます。また、ダイレーションは、分断されてしまったオブジェクトの一部をつなぎ合わせる目的にも使えます。

  • カーネルを作成します。カーネルは3×3、5×5、7×7のような奇数サイズの行列として定義します。

  • 画像上のある1ピクセルに着目したとき、カーネルが覆う範囲に1つでも1のピクセルが存在すれば、そのピクセルは1に設定されます。

  • その結果、画像の白色領域、すなわち前景オブジェクトのサイズが拡大していきます。

サンプルコード

以下のコードでは、元画像に対して3×3のカーネルを用いてエロージョンとダイレーションをそれぞれ1回ずつ適用し、結果を並べて表示しています。iterations引数の値を変更することで、処理の強さを調整できます。

import cv2 
import numpy as np

input_image = cv2.imread('TP_logo.jpg', cv2.IMREAD_COLOR)
kernel = np.ones((3,3), np.uint8)   # numpyで3x3のカーネルを定義

# 元画像からエロージョン画像とダイレーション画像を生成
erosion_image = cv2.erode(input_image, kernel, iterations=1)
dilation_image = cv2.dilate(input_image, kernel, iterations=1)

cv2.imshow('Input', input_image)
cv2.imshow('Erosion', erosion_image)
cv2.imshow('Dilation', dilation_image)
cv2.waitKey(0)   # キー入力を待って終了

実行結果

左から元画像・エロージョン適用後・ダイレーション適用後の画像が表示され、収縮と膨張の違いを視覚的に確認できます。

【Python×OpenCV】画像の収縮(エロージョン)と膨張(ダイレーション)の基本を解説
  1. PythonとOpenCVで実現する画像の加算とブレンディング

    画像処理において、画像は行列(マトリクス)として扱われます。行列の中身は画像の種類によって異なり、二値画像(0と1)、グレースケール画像(0〜255)、RGB画像(各チャンネル0〜255)などがあります。したがって、2枚の画像を「加算する」ということは、対応する位置にある画素同士の行列を単純に足し合わせることを意味します。 OpenCVライブラリには、画像を加算するための関数 cv2.add() が用意されています。ただし、画像の加算を行う際は、2枚の画像のサイズ(幅と高さ)が同一である必要がある点に注意してください。また、cv2.add() は飽和演算(サチュレーション)を行うため、計算結果

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

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