가장자리를 찾지 않고 (= 회색 값이 높거나 낮은 확장 영역 사이의 경계선), 능선을 찾고 있습니다 (가장 가까운 선보다 어둡거나 밝은 선) 가장자리 필터가 이상적이지 않을 수 있습니다. 두 개의 측면 (라인의 각 측면에 하나씩)과 라인 중간에 낮은 응답을 제공하십시오.
ADD : 에지 디텍터와 릿지 디텍터의 차이점을보다 명확하게 설명하라는 요청을받은 경우. 이 답변이 너무 길어지면 미리 사과드립니다.
가장자리 감지기는 (일반적으로) 1 차 미분 연산자입니다. 입력 이미지를 3D 풍경으로 생각하면 가장자리 감지기는 해당 풍경의 각 지점에서 경사의 가파른 정도를 측정합니다.
확장 된 밝거나 어두운 영역의 경계를 감지하려면이 정도면됩니다. 그러나 OP의 이미지의 정맥은 각 정맥의 왼쪽과 오른쪽 윤곽선을 그대로 제공합니다.
또한 Canny edge detector 결과의 "double line pattern"에 대해서도 설명합니다.
그렇다면이가는 선 (즉, 융기 부분)을 어떻게 감지합니까? 아이디어는 픽셀 값이 2 차 다항식에 의해 (로컬로) 근사화 될 수 있다는 것입니다. 즉, 이미지 함수가 인 경우 및 의 작은 값의 경우 :gxy
g(x,y)≈12x2∂2g∂x2+xy∂2g∂x∂y+12y2∂2g∂y2+x∂g∂x+y∂g∂y+g(0,0)
또는 매트릭스 형태로 :
g(x,y)≈12(xy).⎛⎝⎜∂2g∂x2∂2g∂x∂y∂2g∂x∂y∂2g∂y2⎞⎠⎟.(xy)+(xy).(∂g∂x∂g∂y)+g(0,0)
2 차 미분 행렬 는 " 헤 시안 매트릭스 ". 관심있는 2 차 구조를 설명합니다.⎛⎝⎜∂2g∂x2∂2g∂x∂y∂2g∂x∂y∂2g∂y2⎞⎠⎟
이 함수의 2 차 부분은 위의 Hessian 행렬을 고유 값의 대각 행렬의 회전 시간으로 분해하여 어떤 각도로 회전 한 두 개의 parabolas 의 합으로 변환 될 수 있습니다. ( 매트릭스 분해 ). 우리는 회전에 신경 쓰지 않습니다 (우리는 모든 방향으로 릿지를 감지하고 싶습니다). 및 에만 관심이 있습니다λ1x2+λ2y2λ1λ2
이 함수 근사는 어떤 종류의 모양을 가질 수 있습니까? 실제로 그렇게 많지는 않습니다.
능선을 감지하기 위해 위 그림의 마지막 그림처럼 보이는 영역을 찾고자합니다. 따라서 Hessian의 고유 고유 값이 큰 영역 (작은 고유 값에 비해)을 찾고 있습니다. 이를 감지하는 가장 간단한 방법은 각 픽셀에서 주요 고유 값을 계산하는 것입니다. 아래 릿지 필터가 수행하는 방식입니다.
능선 필터는 아마 더 나은 결과를 제공 할 것입니다. 이미지에서 Mathematica의 내장 RidgeFilter
(각 픽셀에서 Hessian 행렬의 주요 고유 값을 계산)을 시도했습니다 .
보시다시피, 얇은 선마다 하나의 피크 만 있습니다. 이진화 및 골격 화 수율 :
뼈대를 잘라 내고 이미지에서 작은 구성 요소 (소음)를 제거한 후이 마지막 뼈대를 얻습니다.
전체 Mathematica 코드 :
ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]
더하다:
나는 Matlab 전문가가 아니며, 릿지 필터가 내장되어 있는지는 모르겠지만 "수동으로"(Matematica를 사용하여) 구현하는 방법을 보여줄 수 있습니다. 내가 말했듯이, 릿지 필터는 헤 시안 행렬의 주요 고유 값입니다. Mathematica에서 고유 값을 상징적으로 계산할 수 있습니다.
eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]
=>12(Hxx+Hyy+H2xx+4H2xy−2HxxHyy+H2yy−−−−−−−−−−−−−−−−−−−−−−−√)
따라서해야 할 일은 2 차 도함수 , , (소벨 또는 가우스 필터의 파생물 사용)을 계산하여 삽입하는 것입니다. 위의 식에 릿지 필터가 있습니다. H xy H yyHxxHxyHyy