2012-08-29 2 views
5

제 질문은 간단합니다. 너무 단순 할 수도 있습니다. 그러나이 프로젝트에서 다음 두 줄을 사용하여 이진 이미지를 확장했습니다.6x6 구조 요소가있는 구조 요소와 3x3 구조 요소를 사용하여 두 개의 형태학 적 확장을 수행하고 있습니까?

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 2); 

기본적으로 이진 이미지를 3x3 직사각형 구조 요소로 확장합니다. 나는 6 × 6 구조를 사용하여 하나의 반복을 수행하는 경우, 대신에 두 개의 반복을 수행 : 마지막 인수에서 내가가 동등이 작업의 2 반복 수행하고 볼 수 있습니다

cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 
cv::dilate(c_Proj, c_Proj, Mat(), Point(), 1); 

내 질문은 이것이다 엘리먼트인데 정확도와 성능 측면에서 위의 코드와 동일합니까? 이미지가 한 번만 반복 될 때 더 빠릅니까?

답변

6

팽창 시킴 두 컨벌루션 연산으로 표현 될 수있다 : 3 × 3 커널의 컨볼 루션

"YourImage" convolve ("DilationKernel" convolve "DilationKernel") 

: 때문에 회선의 특성

("YourImage" convolve "DilationKernel") convolve "DilationKernel" 

이 작업에 equivelant이고 자체적으로 5x5 행렬이되므로 6x6 가정은 잘못됩니다.

성능 측면에서 고려해야 할 사항이 너무 많습니다. 이전 인턴쉽에서는 더 큰 커널의 성능 손실 때문에 가능한 한 작은 커널을 사용하는 것이 목표였습니다. 엄지의 규칙은 작은 커널은 L1 또는 L2 캐시에 액세스하지 않고 단순히 CPU 레지스터를 사용하여 이미지를 저장하고 검색 할 수 있기 때문에 이미지에서 더 빨리 작동한다는 것입니다. 또한 커널이 레지스터에 들어 맞으면 SSE 명령어를 쉽게 사용할 수 있습니다.

컨볼 루션의 병렬 처리는 또 다른 이야기이며, 이에 대한 많은 실제 정보가 없습니다. 따라서 병렬화 된 구현을 사용하는 경우 이러한 경험적 사실이 여전히 유지된다는 것을 알지 못합니다.

+0

실수를 지적 해 주셔서 감사합니다. 나는 아직도 성능 비교를 찾고있다. 두 가지 작업을 비교할 수있는 자체 메서드를 고안해야 할 수도 있습니다. – masad

0

성능을 직접 측정해야하지만 6x6 요소가있는 하나의 팽창이 더 빠르다는 것은 논리적 인 것처럼 보입니다. Wikipedia sais는 바이너리 확장이 결합적임을 의미합니다. 즉, 이러한 다른 직사각형으로 확장 된 3x3 직사각형이 6x6 직사각형을 제공하면 실제로 3x3에 의한 두 개의 확장은 6x6에 의한 하나의 확장과 같습니다. 동일한 커널

+2

왜 "논리적으로 보입니까"? 순진한 구현은 각 픽셀 또는 2 * 3 * 3 픽셀에 대해 6 * 6 이웃을 조사해야합니다. 6 * 6> 2 * 3 * 3 – Niki

+0

@nikie, 네가 맞아. 직사각형 구조 요소의 경우 접두사 합계를 사용하여 최적화 할 수 있습니다. 나는 이미지 형태학에 사용 된 알고리즘에 익숙하지 않다. –