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