2019年1月23日 更新

Morphology (モルフォロジー) 変換の実装 ~ Python + OpenCV ~

画像処理の一つ,モルフォロジー変換をPython と OpenCVのライブラリを用いて実装し,それを2値画像に対して適用します.

2,714 view お気に入り 0

Morphology (モルフォロジー変換)

モルフォロジー変換とは,2値画像に関して,「膨張」や「収縮」などと言った処理を施す操作のことです [1].モルフォロジーには,入力画像と構造的要素(Kernel)の二つを入力として与えます.
本記事では,膨張や収縮がどのように実装されるのか確認してみます.

Part1. 膨張処理

膨張処理はその名前の通り,画素を膨張 させる処理のことです.これは,画像に対する「+」の演算と考えてよいでしょう.

例えば,以下のような2値画像があったとします.

図1. Jが書かれた2値画像

図1. Jが書かれた2値画像

この画像に関して,MorphologyKernel として,右図のようなものを与えてみましょう.

まず,上の行に注目です.Input として,左上のようなものがあったとき,中央のKernel のものを畳み込むと結果的にOutput のような模様が得られます.注目すべきは,Input に青色があれば,その要素に加えて下と右も塗りつぶされる,ということです.これがMorphology変換の膨張の処理です.なお,図は[2]を参考にしました.

図2. Kernel とそのConvolutionの関係

図2. Kernel とそのConvolutionの関係

Python による実装

それでは,上の処理をPythonで実装してみましょう.for 文を使うと簡単ですね.
import cv2
import numpy as np
import matplotlib.pyplot as plt
ライブラリインポート.py
img = cv2.imread('j.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh =100
max_pixel = 255
gray_thresh = cv2.threshold(gray, thresh, max_pixel, cv2.THRESH_BINARY)
j_img = gray_thresh[1]
2値化など.py
plt.gray()
plt.imshow(j_img)
プロット.py
 (5271)

## Morphology
shp = np.shape(j_img)
morph_gray = np.zeros(shp)
for row in range(shp[0]):
    for col in range(shp[1]):
        if j_img[row,col] == 255:
            morph_gray[row,col]= 255
            morph_gray[row,col+1] = 255
            morph_gray[row-1,col] = 255
            
Morphology.py
plt.gray()
plt.imshow(morph_gray)
プロット.py
33 件

関連する記事 こんな記事も人気です♪

等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

前回の記事「等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 1」の続きです. 実際に実装をして,写像を確かめてみます.
三好 裕之 | 1,919 view
画像の一部を消すInpainting という技術とその実装 (python)

画像の一部を消すInpainting という技術とその実装 (python)

Python + OpenCVにより,画像の修復の技術,「Inpainting 」の実装を行います.
三好 裕之 | 11,099 view
画像のFilter をPython で視覚的に理解する (Gaussian, Edge 抽出).

画像のFilter をPython で視覚的に理解する (Gaussian, Edge 抽出).

Python を用いて,画像のFilter を視覚的に理解してみます.コードを載せていますので,実装可能です.
三好 裕之 | 12,168 view
Extracting Straight Lines〜画像から境界線を効率よく求める方法〜

Extracting Straight Lines〜画像から境界線を効率よく求める方法〜

本記事では,IEEE Transactions on Pattern Analysis and Machine Intelligence に投稿された,「Extracting Straight Lines」の論文を説明し,実装を行います.1986年に投稿された少し古めの論文ですが,アイディアは非常に面白いです.
三好 裕之 | 1,370 view
ディジタル画像処理~pythonによる空間フィルタリングpart1~ 

ディジタル画像処理~pythonによる空間フィルタリングpart1~ 

ディジタル画像処理を解説します.今回は,代表的な空間フィルタリングをpythonで実行してみました。
亀谷 桃子 | 2,389 view

この記事のキーワード

この記事のキュレーター

三好 裕之 三好 裕之