죄송합니다. OpenCV를 모르며 이는 완전한 답변보다 사전 처리 단계입니다.
첫째, 당신은 가장자리 탐지기를 원하지 않습니다. 가장자리 감지기는 다음과 같이 전환을 변환합니다 (이 어두운 빛과 같은).
다음과 같이 융기 부분 (어두운 부분의 밝은 선)으로
즉, 차별화를 수행합니다.
그러나 이미지에는 한 방향에서 빛이 비추어 3D 표면의 릴리프를 보여줍니다. 우리는 이것을 3D로 보는 데 익숙하기 때문에 이것을 선과 가장자리로 인식하지만 실제로는 그렇지 않습니다. 왜냐하면 가장자리 감지기가 작동하지 않으며 회전 된 이미지에서 템플릿 일치가 쉽게 작동하지 않습니다 (완벽한 0도에서 일치하면 빛과 어둠이 서로 정렬되므로 실제로 180도에서 회전이 완전히 취소됩니다.
이 흐릿한 선 중 하나의 높이가 측면에서 다음과 같이 보일 경우 :
한쪽에서 비추면 밝기 기능은 다음과 같습니다.
이것은 당신이 당신의 이미지에서 볼 수 있습니다. 마주 보는 표면이 밝아지고 후행 표면이 어두워집니다. 따라서 차별화하고 싶지 않습니다. 조명 방향을 따라 이미지 를 통합 해야 하며 표면의 대략적인 높이 맵을 제공합니다. 그러면 Hough 변환이나 템플릿 일치 등을 통해 사물을 쉽게 일치시킬 수 있습니다.
조명 방향을 자동으로 찾는 방법을 잘 모르겠습니다. 모든 이미지에서 동일하다면 좋습니다. 그렇지 않으면 가장 큰 대비 선을 찾아서 빛이 그와 직각 인 것으로 가정해야합니다. 예를 들어, 왼쪽에서 빛이 들어오는 방향으로 이미지를 올바른 방향으로 수동으로 회전했습니다.
그러나 빠르게 변화하는 선 모양의 기능 만 강조 표시하려면 이미지에서 저주파 변화를 모두 제거해야합니다. 울리는 인공물을 피하기 위해 2D Gaussian blur를 사용한 다음 원본에서 빼기 :
적분 (누적 합계)이 쉽게 벗어날 수있어 가로 줄무늬가 나타납니다. 이번에는 또 다른 가우시안 하이 패스로 이것을 제거했지만 이번에는 수평 방향으로 만 제거했습니다.
이제 구내염은 흰색 타원이며 어떤 곳에서는 흰색이되고 다른 곳에서는 검은 색이 아닙니다.
기발한:
통합 :
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
허프 변환 은 계산과 메모리에 정말 비싼 불구하고, "가장자리 픽셀"로 만든이 같은 능선 타원을 감지하는 데 사용할 수 있으며, 그것은 "실수"검출기의 비트 될 것이다, 그래서 그들은 완벽한 타원 없습니다. 한 번도 해보지 않았지만 " 거친 타원 감지 "에 대한 Google 결과가 많이 있습니다. 특정 크기의 검색 공간 내에서 다른 하나의 타원을 감지하면 스토 마로 계산해야한다고 말하고 싶습니다.
참조 :