OpenCV

画像処理 「OpenCV 4」エッジを抽出してみる

今回はラプラシアンフィルタと、Sobelフィルタを使って、エッジを抽出してみます。

ラプラシアンフィルタ

cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

src – 入力画像
ddepth – 出力画像の指定された深度
dst – srcと同じサイズ・同じチャンネル数の出力画像
ksize – 2次微分フィルタの計算に利用されるサイズ。詳細は getDerivKernels() を参照。サイズは正の奇数
scale – 計算されるラプラシアン値のスケール係数。デフォルトでは,スケーリングは適用されない。詳細は getDerivKernels() を参照
delta – オプションで結果を dst に保存する前に結果に追加されるデルタ値
borderType – ピクセル外挿法。詳細は borderInterpolate を参照

サンプルコード

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread("image.png", 0)

plt.subplot(1, 2, 1)
plt.title('original')
plt.imshow(image, cmap='gray')

image = cv2.Laplacian(image, cv2.CV_64F, ksize=3)
plt.subplot(1, 2, 2)
plt.title('laplacian')
plt.imshow(image, cmap='gray')

plt.show()
実行結果

Sobelフィルタ

cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

src – 入力画像
ddepth – 出力画像の指定された深度
dst – srcと同じサイズ・同じチャンネル数の出力画像
src.depth() と ddepth の以下の組み合わせがサポートされています
src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F, ddepth = -1/CV_64F
ddepth=-1 の場合、出力画像は入力画像と同じ深度になる

xorder – 微分xの次数
yorder – 微分 y の次数
ksize – 拡張ソーベルカーネルのサイズ。デフォルトでは、スケーリングは適用されない(詳細は getDerivKernels() を参照)
delta – オプションで結果を dst に保存する前に結果に追加されるデルタ値
borderType – ピクセル外挿法。詳細は borderInterpolate を参照

サンプルコード

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread("image.png", 0)

sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)

plt.subplot(2, 2, 1)
plt.title('original')
plt.imshow(image, cmap='gray')
plt.subplot(2, 2, 2)
plt.title('sobel X')
plt.imshow(sobelx, cmap='gray')
plt.subplot(2, 2, 3)
plt.title('sobel Y')
plt.imshow(sobely, cmap='gray')

plt.show()
実行結果