エッジ検出のお勉強(OpenCV+python)
Sobel Edge Detection
import cv2 image = cv2.imread('iron_man.png') gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) gray_sobel_x = cv2.Sobel(gray_image,cv2.CV_32F,1,0) cv2.imshow('gray_sobel_x',gray_sobel_x) gray_sobel_y = cv2.Sobel(gray_image,cv2.CV_32F,0,1) cv2.imshow('gray_sobel_y',gray_sobel_y) gray_abs_sobel_x = cv2.convertScaleAbs(gray_sobel_x) cv2.imshow('gray_abs_sobel_x',gray_abs_sobel_x) gray_abs_sobel_y = cv2.convertScaleAbs(gray_sobel_y) cv2.imshow('gray_abs_sobel_y',gray_abs_sobel_y) gray_sobel_edge = cv2.addWeighted(gray_abs_sobel_x, 0.5, gray_abs_sobel_y, 0.5, 0) cv2.imshow('gray_sobel_edge',gray_sobel_edge) cv2.waitKey(0) cv2.destroyAllWindows()
x y z
参考: 配列操作 — opencv 2.2 documentation Python + OpenCVでエッジ検出 (Sobel) | Non-Fiction
Laplacian Edge Detection
import cv2 image = cv2.imread('iron_man.png',0) #image = cv2.GaussianBlur(image, (3,3), 0) # gaussian filter laplacian = cv2.Laplacian(image,cv2.CV_32F) #laplacian = cv2.Laplacian(image,cv2.CV_32F, 3) laplacian_edge = cv2.convertScaleAbs(laplacian) cv2.imshow('laplacian_edge', laplacian_edge) cv2.waitKey(0) cv2.destroyAllWindows()
平滑化するとより暗くなり、わかりにくい。
参考: 画像フィルタリング — opencv v2.1 documentation
Canny Edge Detection
opencvにそのままあった…
import cv2 ORIGIN_FILE_NAME = "iron_man.png" GRAY_FILE_NAME = "gray.png" CANNY_FILE_NAME = "canny.png" origin_image = cv2.imread(ORIGIN_FILE_NAME) gray_image = cv2.imread(ORIGIN_FILE_NAME, cv2.IMREAD_GRAYSCALE) canny_image = cv2.Canny(gray_image, 200, 230) cv2.imshow(ORIGIN, origin_image) cv2.imshow(GRAY_FILE_NAME, gray_image) cv2.imshow(CANNY_FILE_NAME, canny_image) cv2.waitKey(0) cv2.destroyAllWindows()
白の部分が何ピクセルあるかを表示
import cv2 ORIGIN_FILE_NAME = "iron_man.png" origin_image = cv2.imread(ORIGIN_FILE_NAME) gray_image = cv2.imread(ORIGIN_FILE_NAME, cv2.IMREAD_GRAYSCALE) canny_image = cv2.Canny(gray_image, 50, 150) height, width = canny_image.shape canny_image = canny_image[height/2:height , 0:width/2 ] # limit range save_edge_data = 0 for i in canny_image: for j in i: save_edge_data += j print save_edge_data/255 # display white space pixel volume cv2.waitKey(0) cv2.destroyAllWindows()
例えばこの値を用いてある場所にエッジがあったかどうかを判断できる。