2012-11-16 8 views
1

더 큰 이미지 안에 더 작은 이미지의 위치를 ​​찾아야합니다. 작은 이미지는 더 큰 이미지의 하위 집합입니다. 이미지가 다른 JPEG 압축에 의해 생성 된 경우 픽셀 값이 약간 다를 수도 있다는 요구 사항이 있습니다. 저는 CPU를 사용하여 바이트를 비교하여 솔루션을 구현했지만 프로세스 속도를 높일 수있는 가능성을 찾고 있습니다. 어떻게 든 OpenGLES와 iPhone GPU를 사용할 수 있습니까?하드웨어 가속 이미지 비교/검색?

참고 : 이미지는 회색조입니다.

답변

1

@Ivan, 이것은 비디오 압축 (이전 프레임에서 현재 매크로 블록의 위치 찾기)에서 꽤 표준적인 문제입니다. SAD (sum of abs difference), SSD (sum of differences) 또는 HADMARD 변환 된 차이 (SATD)의 합계와 같은 픽셀의 차이에 대한 메트릭을 사용할 수 있습니다. 나는 비디오를 압축하려고하지 않고 오히려 워터 마크와 같은 것을 찾고 있다고 가정합니다. 대부분의 경우 그래디언트 디센트 유형 검색을 사용하여 이미지의 작은 이미지와 약간 오프셋 된 이미지를 비교하는 실험적 관찰에서 로컬 최소값 (가장 일치하는 값)을 찾을 수 있습니다. 정확하게 발견 된 이미지)는 다른 이미지의 무작위 부분과 비교하는 것보다 더 가까운 메트릭을 생성합니다. 따라서 가능한 모든 오프셋/위치 (비디오 인코딩의 모션 벡터)의 공간을 다소 거칠게 샘플링 한 다음 가장 좋은 결과를 중심으로 로컬 최적화를 수행하면됩니다. 국부적으로 최적화는 몇몇 이웃 성냥에 성냥을 비교해서 작동하고, 어떤 것이 너의 현재 성냥보다는 더 낫 경우에 그들의 베스트에 이동은, 반복한다. 이것은 무차별 공격 (가능한 모든 위치 확인)보다 훨씬 빠르지 만 모든 경우에 작동하지 않을 수 있습니다 (일치되는 대상의 성격에 따라 다름). 불행히도 이러한 유형의 알고리즘은 각 단계가 이전 단계에 의존하기 때문에 GPU로 잘 변환되지 않습니다. 여전히 가치가있을 수 있습니다. 예를 들어 256x256 이미지의 위치에 16 개 이웃을 확인하면 GPU로 전송하기에 충분한 병렬 계산입니다. 그렇다면 OpenGL-ES에서 절대적으로 수행 할 수 있습니다. 그러나 모든 것에 대한 해답은 무차별 대입 또는 로컬 최소화 유형 검색을 수행하는지 여부와 로컬 최소화가 사용자에게 도움이되는지 여부에 따라 달라집니다.

+0

이 철저한 답변을 보내 주셔서 감사합니다. 지금 나는 복근 차이의 합계를하고있다. 나는 비디오를 다루지 않는다. 약간 특이합니다. 서비스에서 두 개의 이미지를 얻었고 더 작은 이미지가있는 정확한 지점에서 더 큰 이미지를 확대 할 수 있어야합니다. 그러면 사용자가 원하는대로 축소 할 수 있습니다. 내가 언급하지 않은 것은 더 작은 이미지가 다른 해상도에있을 수 있다는 것입니다. 그래서 나는 매치를 찾을 때까지 모든 결의를 강하게 강제합니다. 그게 GPU에서 병렬화 될 수 있다고 생각합니까? 그러나 나는 그것이 어떻게 행해지는지보기 시작할 곳을 알 수 있었으면 좋겠다. –

+2

@IvanKovacevic - 비교 자체는 두 이미지의 차이 블렌딩을 사용하여 GPU에서 쉽게 수행 할 수 있습니다 (예 : GPUImage 프레임 워크는 매우 간단하게 수행 할 수 있습니다). 그리고 차이의 상대적 측정은 평균 휘도 결과 (다시 GPU에서 수행 할 수있는 작업). 보다 강력한 접근 방법은 피쳐 매칭을 사용하는 것일 수도 있지만이를 위해서는 훨씬 많은 코딩 노력이 필요합니다. –

+0

Brad에게 프레임 워크가 멋지 네요! 블렌드와 루미넌스를 사용하여이 기법을 시도해 보겠다. 그러나 픽셀 단위로 원본 이미지를 이동하고 같은 크기의 이미지를 만들어야하기 때문에 병목 현상이 GPU에서 이미지를 보내거나 초기화한다는 것이 조금 의심 스럽다. (필자가 비교하고있는) 서브 이미지로서, 그리고 diff 블렌딩 필터로 보내라. 어쩌면 GPU의 모든 기능을 수행하는 사용자 정의 필터를 작성할 수 있습니까? –

관련 문제