You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.5 KiB
40 lines
1.5 KiB
# 実験課題5
|
|
# 3.5 エッジ処理
|
|
|
|
import cv2
|
|
|
|
# 画像の読み込み(エッジ検出は通常グレースケール画像に対して行います)
|
|
image_path = 'cat.jfif'
|
|
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
|
|
|
|
# --- Sobel(ソーベル)フィルタ ---
|
|
# X方向の勾配(縦のエッジ)とY方向の勾配(横のエッジ)を計算
|
|
# 負の勾配を保持するため、出力データ型を cv2.CV_64F に指定
|
|
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
|
|
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
|
|
|
|
# 絶対値を取り、表示可能な8ビット符号なし整数(0〜255)に変換
|
|
sobel_x_abs = cv2.convertScaleAbs(sobel_x)
|
|
sobel_y_abs = cv2.convertScaleAbs(sobel_y)
|
|
|
|
# X方向とY方向の画像を1:1の割合で合成して全体のエッジ画像を作成
|
|
sobel_combined = cv2.addWeighted(sobel_x_abs, 0.5, sobel_y_abs, 0.5, 0)
|
|
|
|
# --- Laplacian(ラプラシアン)フィルタ ---
|
|
# 2次微分を用いて全方向のエッジを同時に検出
|
|
laplacian = cv2.Laplacian(img, cv2.CV_64F)
|
|
laplacian_abs = cv2.convertScaleAbs(laplacian)
|
|
|
|
# --- Canny(キャニー)法 ---
|
|
# ノイズ除去と2つの閾値処理を組み合わせた、より高精度なエッジ検出アルゴリズム
|
|
canny = cv2.Canny(img, 50, 150)
|
|
|
|
# --- 結果の表示 ---
|
|
cv2.imshow('Original Grayscale', img)
|
|
cv2.imshow('Sobel Edge', sobel_combined)
|
|
cv2.imshow('Laplacian Edge', laplacian_abs)
|
|
cv2.imshow('Canny Edge', canny)
|
|
|
|
# キー入力待ち
|
|
cv2.waitKey(0)
|
|
cv2.destroyAllWindows() |