2012-04-26 5 views
6

C++에서 16 비트 (부호없는 short) 배열에 대한 빠른 중간 필터 알고리즘을 아는 사람이 있습니까? C++의 Fast Median 필터

http://nomis80.org/ctmf.html

이 하나

은 매우 유망한 보이지만, 단지 바이트 배열로 작동하는 것 같다. 누구든지 반바지 또는 대체 알고리즘으로 작동하도록 수정하는 방법을 알고 있습니까?

+3

당신은 표준을 시도해 봤어 :: nth_element를? 그것은 O (n)과 O (n log n)의 비교가됩니다. – smocking

+0

픽셀 당 실행 시간이 2^n에 비례하기 때문에이 알고리즘을 short로 작동시키지 않으려면이 알고리즘을 수정하지 마십시오. 여기서 n은 사용되는 데이터 유형의 비트 수입니다. 8 비트 어레이의 경우 256 개가 이미 고통 스럽기 때문에 16 비트 어레이의 경우 65536 개를 사용하고 싶지 않습니다. O (1) 대신 픽셀 당 O (log r) 인 경우에도 빠른 알고리즘에 대한 내 대답을 참조하십시오. – HelloGoodbye

+0

메디안 필터링을하지 않으려는 경우 (예 : 각 픽셀에 대해 하나의 중간 값을 찾고 하나의 중간 값을 찾으려는 이미지 처리의 경우) @ smocking의 설명이 적합합니다. – HelloGoodbye

답변

3

Here (PDF)는 C에서 사용하는 것으로 "빠른 중앙 검색 : ANSI C 구현"이라는 제목의 문서입니다. 저자는 그것이 O (log (n))이라고 주장하지만, 그는 또한 약간의 코드를 제공합니다. 아마도 도움이 될 것입니다. 그것은 당신의 제안 된 코드보다 좋지는 않지만 아마도 가치있는 것일 수도 있습니다.

+0

질문에 연결된 종이는 O (log n)보다 좋은 O (1)입니다. –

+0

그래,하지만 이건 어쩌면 충동을 더 줄 수도 있겠지만, 네 말이 맞아. 나는 나의 의도를 분명히하면서 작은 편집을했다. –

+0

@MarkRansom : O (1)은 자동으로 O (log (n))보다 좋지 않습니다. O 상수 표식이 항상 상수이기 때문입니다. 이 경우 O (1) 알고리즘은 O (log (n)) 알고리즘 (2 비트 또는 4 비트 채널 값 이외의 경우)보다 훨씬 느립니다. O (1) 용지는 히스토그램과 함께 작동하여 픽셀 당 실행 시간이 2^b에 비례합니다. 여기서 b는 채널당 비트 수입니다. 8 비트는 256이고 16 비트는 65536입니다. 상수, 따라서 O (1)). 이렇게하면 채널 값에 더 많은 비트를 추가 할 때 O (1) 알고리즘이 빠르게 느려질 수 있습니다. – HelloGoodbye

4

이 기술은 8 비트 픽셀 채널에 대해 256 개 빈을 사용하여 막대 그래프를 만드는 방법에 의존합니다. 채널당 16 비트로 변환하려면 65536 개의 bin이있는 히스토그램이 필요하며 이미지의 각 열에 히스토그램이 필요합니다. 메모리 요구 사항을 256으로 늘리면이 알고리즘은 전반적으로 덜 효율적인 알고리즘이되지만 오늘날의 하드웨어에서도 여전히 유용 할 수 있습니다.

히스토그램을 거친 섹션과 정밀한 섹션으로 나누는 제안 된 최적화를 사용하면 런타임 히트가 16x로 줄었습니다.

반경 값이 작을 경우 기존의 중간 값 필터링 방법이 더 효율적이라는 것을 알게 될 것입니다.

0

이 다소 오래 그러나 나는 또한 중간 필터링에 관심이 있어요. 신호 또는 이미지로 작업하는 경우 처리 창의 데이터가 크게 중복됩니다. 이것은 활용 될 수 있습니다. 그것은 대부분의 POD 데이터 형식으로 작업을해야하므로 1D moving median filtering in C++

그것은 템플릿을 기반으로 :

나는 여기에 몇 가지 벤치 마크 코드를 게시했습니다.

내 결과에 따르면 std::nth_element은 매번 값 창을 정렬해야하므로 이동 평균값에 대한 성능이 좋지 않습니다.

그러나 정렬 된 값의 풀을 사용하면 3 작동으로 중앙값을 수행 할 수 있습니다.

  1. 풀에서 가장 오래된 값을 제거 풀로
  2. 삽입 새 값 (표준 : LOWER_BOUND를 호출) 히스토리 버퍼에서
  3. 스토어 새로운 값 (표준 : LOWER_BOUND 호출)

중앙값은 이제 풀의 중간 값입니다.

누군가가이 흥미로운 것을 발견하고 아이디어를 기원합니다.

1

이 문서 R 필터 반경이고, 모든 데이터 유형에 대한 작동 화소 당 시간, (그 8 개 비트 정수 또는 수 (R 로그) O에서 실행되는 화상의 메디안 필터링하는 방법을 설명 복식) :

Fast Median and Bilateral Filtering