空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

エッジ検出のお勉強(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 f:id:robonchu:20170603163245p:plain y f:id:robonchu:20170603163252p:plain z f:id:robonchu:20170603163259p:plain

参考: 配列操作 — 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()

f:id:robonchu:20170603165349p:plain

平滑化するとより暗くなり、わかりにくい。

参考: 画像フィルタリング — 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()

f:id:robonchu:20170603154145p:plainf:id:robonchu:20170603154200p:plainf:id:robonchu:20170603154215p:plain

白の部分が何ピクセルあるかを表示

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()

例えばこの値を用いてある場所にエッジがあったかどうかを判断できる。

参考: OpenCVでエッジ検出してみる - Qiita