Tech이야기~!
welcom 자세히보기

카테고리 없음

[OpenCV] 이미지필터 _ 에지

Enhold 2019. 12. 16. 20:02

에지검출

이미지의 에지를 검출하는 것은 중요한 개념이며 많은 곳에 적용된다. 

에지를 검추랗면 이미지의 구조와 물체 경계에대해 더 많이 알 수 있다. 

에지는 이미지 내에서 픽셀 값에 중요한 변화가 있는 이미지의 일부로 정의도니다. 

* 이미지의 미분은 픽셀 값의 변화를 찾는 방법이므로 기본적으로 이방법을 통해 이미지의 에지를 찾을 수도 있다. 

이미지 미분만을 사용하는 것은 그다지 강력하지 않다. : 노이즈가 많은 이미지느 ㄴ잘못된 에지를 많이 생성해 비전 시스템의 전반적인 품질을 저하시킨다. 

 

소벨 에지 검출기

소벨 에지 검출기의 기본 아이디어는 큰 크기의 그래디언트 값을 가진 픽셀을 찾느 ㄴ것이다. 

이제 변화뿐만 아니라 변화의 크기 값(이것 또한 그래디언트)을 이용한다. 

그래디언트의 방정식은 다음과 같다. 

얼마나 큰 값을 고려해야 하는지 결정하기 위해 임계값을 설정한다. 그래디언트를 계산하고 특정 임계값을 초과하는 모든 그래디언트 값을 사용한다. 

 

 

큰 그래디언트 값을 가진 픽셀을 사용하는 이유

속이 검은색 상자 내의 모든 픽셀은 비슷한 픽셀 값을 가지지만 경계 또는 에지의 픽셀 값은 이웃 픽셀과는 다르게 갑작스럽게 변한다. 따라서 큰 그래디언트 값을 갖는 픽셀을 고려하는 것이 타당하다. 

소벨 에지 검출 알고리즘에 사용되는 커널

scikit-image

from skimage import io
from skimage import filters
from skimage import color
img = io.imread("chapter02/image.jpg")
img = color.rgb2gray(img)
edge = filters.sobel(img)
io.imshow(edge)
io.imsave("sobel_edge.jpg", edge)
io.show()

캐니 에지 검출기

소벨 에지 검출기와 같은 그래디언트 개념을 사용하지만 소벨에서는 그래디언트의 크기만 고려했었다. 

에지를 찾기위해 그래디언트의 방향을 함께 사용한다. 

 

캐니 에지 검출 알고리즘을 이애해 에지를 검출하는 기본과정

 

1. 부드럽게

 가우시안 필터를 이미지에 적용해 이미지의 노이즈를 줄인다. 

 

2. 그래디언트 찾기

 노이즈 제거 후에 x-미분, y-미분을 계산해 그래디언트의 크기와 방향으 ㄹ찾는다. 그래디언트는 항상 에지에 수직이므로 방향이 중요하다. 따라서 그래디언트의 방향을 알면 에지의 방향도 알수 있다. 

 

3. 비최대 억제 nonmaximal suppression

계산된 그래디언트가 그래디언트의 양의 방향과 음의 방향에 있는 인접한 범 사이에서 최댓값인지 여부를 확인한다. 

즉, 그래디언트 방향의 지역 최댓값인지 여부 확인. 

그 지역 내 최댓값이 아니면 그 점은 에지의 일부가 아니다. 

4 임계값 처리

하나의 임계값을 사용했던 소벨과 달리 두개의 임계값, 즉 높은 임계값과 낮은 임계값을 사용

히스테리시스 입계값 hysteresis thresholding이라고 한다. 

2019/12/16 - [Computer/OpenCV] - ValueError: Image is not numeric, but ndarray.

 

ValueError: Image is not numeric, but ndarray.

문제는 png,jpg,etc 픽셀 유형이 다름 니다. 예를들어 pngsms uint8이라는 것입니다. *img_as_bool을 적용하면 부울 배열이 생깁니다. canny를 사용함으로써 방향성 즉, 유형이 불일치가 발생합니다. 그리고 이러..

figureking.tistory.com

from skimage import *
from skimage import io
from skimage import feature
from skimage import color
img = io.imread("chapter02/image.jpg")
img = color.rgb2gray(img)
edge = feature.canny(img,3)
io.imshow(edge)
#io.imsave("canny_edge.jpg", edge)
io.imsave("canny_edge.jpg", img_as_uint(edge))

io.show()