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

# 実験課題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()