문제

나는 내 자신의 가우스 필터를 작성하지만 정말 느립니다.

OpenCV의 가우스 알고리즘은 가우스 필터보다 20 배 더 빠릅니다. 내 프로젝트에서 OpenCV의 가우스 알고리즘을 다시 작성하고 싶습니다. 프로젝트에 OpenCV를 포함시키고 싶지 않습니다.

하지만,

누구든지 알고리즘 설명을 줄 수 있습니까? OpenCV의 소스 코드는 이해하기 어려운 것처럼 보입니까?

도움이 되었습니까?

해결책

가우스 필터에는 속도를 쉽게 고정시킬 수있는 속성이 있습니다. 필터는 두 차원 모두 독립적으로 적용 할 수 있습니다. 수직으로 작동하는 1 차원 필터와 수평으로 작동하는 다른 필터를 정의하고 둘 다 적용합니다. 이는 두 차원으로 적용되는 단일 필터와 동일한 효과를 생성합니다.

그 외에도 아마도 당신은 아마 심어 지침 예를 들어 SSE3 프로세서에 사용할 수 있습니다.

다른 팁

질문의 두 번째 부분에 답하기 위해 가우스 블러는 단순히 이미지 위의 컨볼 루션 커널로 적용되는 3D 가우시안 표면입니다. 위키 백과 알고리즘 자체에 대한 훌륭한 참조가 있지만 기본적으로 가우스 곡선의 값을 가져 와서 정사각형 매트릭스로 변환하고 이미지의 모든 단일 픽셀로 곱하십시오.

Kernel:               
[0 1 2 0 0
1 4 6 4 1      X   Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]

(이것은 단지 샘플 커널 일 뿐이며, 가우스 변수에 따라 다른 결과를 얻을 수있는 매우 구체적인 EQN이 있습니다).

질문의 성능 부분에 답하기 위해이 알고리즘의 전반적인 속도는 일정한 크기의 이미지를 가정하면 몇 가지 사항에 따라 다릅니다. 이미지가 NXM 픽셀이고 Convolution 커널이 PXP 픽셀이라고 가정 해 봅시다. 당신은 pn*m 작동. P가 클수록 주어진 이미지에 대해 더 많은 작업을 수행해야합니다. 여기에서 사용하는 알고리즘을 사용하여 매우 구체적인 행 또는 원주 기반 수학을 수행 할 수 있습니다.

구현도 매우 중요합니다. 매우 효율적이 되려면 아키텍처가 제공하는 가장 고급 지침을 사용하고 싶을 것입니다. 인텔 X86 칩을 사용하는 경우 IPP (Intel Performance Primitives)에 대한 라이센스를 얻고 해당 지침을 직접 호출하는 것을보고 싶을 것입니다. IIRC, OpenCV는 IPP를 사용할 수있을 때 사용합니다 ...

주어진 아키텍처의 부동 소수점 성능이 좋지 않은 경우 매우 똑똑한 일을하고 모든 규모의 정수와 함께 일할 수 있습니다. 이것은 아마도 약간의 속도를 높일 것입니다. 그러나이 길을 가기 전에 먼저 다른 옵션을 살펴볼 것입니다.

확인해보십시오 여기. 이산 가우시안 매트릭스를 미리 파악한 다음 이미지로 복잡하게 만들고 싶습니다.

Convolution 커널이 비교적 크고 직접 컨볼 루션을 구현하는 경우 OpenCV가 빠른 푸리에 변환 (FFT)을 사용하여 컨볼 루션을 구현하고 있기 때문에 성능 차이가있을 수 있습니다.

나는 pedantic을 싫어하지만, 당신은 알고리즘, 즉 작업을 달성하는 데 필요한 정확한 단계의 순서를 요구하고 있습니다. 이미 가우스 알고리즘이 있습니다. 그래서 질문의 핵심 요점은 당신이 무언가를 요청할 때입니다. 더 빠르게, 이는 알고리즘을 요구하는 것과 다릅니다.

대답합니다 더 빠르게 질문 - OpenCV가 코드를 최적화하는 방법을 알고 싶습니다. 이는 매우 기술적이고 광범위한 주제입니다. 나는 그것이 어셈블리 언어와 GPU 특정 기능을 사용한다고 말함으로써 추측을 위험에 빠뜨릴 것입니다. 어셈블리를 배우고 GPU를 활용하기 위해 CUDA 패키지를 조사하는 것으로 시작합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top