2010-01-22 3 views
0

현재 Bitmap을 바이트 배열로 변환 할 수있는 시점에 있습니다. 26 개의 해당 바이트 배열로 a-z를 나타내는 26 개의 이미지가 있다고 가정합니다. 주어진 이미지를 감안할 때 바이트 배열을 사용하여 최대 26 개의 비교를 수행하는 대신 올바른 문자를 즉시 ​​조회 할 수 있습니다. 구성 파일에 저장할 수있는 해시 코드를 생성하기 위해 바이트 배열을 해싱 할 수있는 방법이 있습니까?C# 이미지 해시 및 검색

또는 (기본 텍스트 표현에 액세스 할 수 없다고 가정 할 때) 이미지를 해싱하는 것보다 더 나은 (더 빠른) 접근 방법이 있다면 나는 그것에 대해 매우 알고 싶습니다. 설명을 위해 "a.bmp", "b.bmp"등이 있다고 가정합니다. 이제 화면에 알 수없는 이미지가 있습니다. 나는 이미지 해싱을 생각하고 단일 검색을 수행하는 것이 긍정적 인 식별을위한 가장 빠른 방법이 될 것입니다. 최대 26 개인 비교를 수행하는 것보다 빠릅니다. 이 가정이 틀린 경우, 최적의 방법에 대한 개요를 이해할 수 있습니다.

참고 : 문자가 매번 동일하게 렌더링되기 때문에 고전적인 OCR 문제 (필기 인식 등)가 아닙니다. 따라서 문자 "a"는 항상 정확히 동일한 해시 코드를 생성합니다.

+2

우리는 여전히 그 "이유"를 완전히 이해하지 못합니다. 지금까지 보았던 것을 토대로, 나는 이미지를 "a.bmp", "b.bmp"등으로 이름을 짓겠다. 만약 내가 메모리에 전부 다 넣었다면 Dictionary 일 수도있다. –

+0

이제 좀 더 이해가됩니다. 이미지를 해싱하는 것은 이미지에서 픽셀 정렬을위한 고유 한 지문을 생성하며 사람이 이미지에 나타나는 것으로 생각하지 않습니다. 한 픽셀을 FFFFFF에서 FFFFFE로 변경하면 완전히 다른 해시를 얻습니다. –

답변

4

바이트 배열 here을 해시하는 C# 알고리즘을 찾을 수 있습니다. 그런 다음 C# 해시 테이블 데이터 유형을 사용하여 해시를 문자에 매핑 할 수 있습니다. 그러나 모든 비트 맵의 ​​모든 바이트를 스캔해야하므로 연산은 O (B * N)입니다. 여기서 B는 비트 맵의 ​​바이트 수이고 N은 문자 수입니다. 일반적인 비트 맵의 ​​크기를 고려할 때 특히 효율적이지는 않습니다.

그러나 OCR (광학 문자 인식) 인 경우이 해시 함수는 전혀 쓸모가 없습니다. 해시 값은 한 픽셀이 다르더라도 크게 달라 지므로 스캐너 또는 디지털 카메라의 일반적인 광학 노이즈로 인해 동일한 문자의 두 그림이 동일하게 해시되지 않습니다. 프로그래밍 방식의 OCR 기술이 있지만 매우 심오한 주제이며 OCR 문제인 경우 미리 빌드 된 라이브러리를 사용하는 것이 훨씬 좋습니다.

+0

그런 이유로 모든 C# 개체는 .GetHashCode() 메서드를 제공합니다. –

+2

사실이지만 개체 ID를 기반으로 구현이 해시됩니다.서로 다른 메모리 주소에있는 두 개의 동일한 바이트 배열은 두 개의 다른 해시 코드를 반환합니다. 나는 이것이 의심스러워하는 행동이 아니라고 생각합니다. –

1

더 좋은 질문은 다음과 같습니다. 왜이 문제에 어떻게 접근하고 있습니까? 어떤 상황에서 바이트 배열을 받고이를이 방식으로 문자와 일치시켜야합니까? 이것은 이미지 또는 문자 인식에 대한 좋은 접근법이 아니며 다른 모든 문제는 이미지 데이터 자체보다 더 유용하고 효율적인 키가 될 이미지를 설명하는 메타 데이터를 제공합니다.

+1

나에게 숙제처럼 보입니다. 그렇지 않으면 신속하고 더러운 OCR이 있습니다. – egrunin

+0

숙제에 대해 동의하십시오.이 방법은 쓸모없는 단일 픽셀 차이로 빠르고, 더럽고 쓸모가 없습니다. –

1

함께 고려할 때 각 이미지에 대해 고유 한 작은 바이트 수를 찾습니다. 이미지를 고유하게 정의하는 4 바이트 이하를 발견하면 간단한 비트 이동 작업을 사용하여이 4 바이트를 추출하여 Int32로 직접 변환 할 수 있습니다. 이 정수는 저장할 수있는 이미지의 지문입니다.

다른 방법으로는 실행 속도가 약간 느리지 만 코드 작성이 훨씬 쉬운 경우 표준 해시 함수 (예 : SHA-1)를 사용하여 바이트 배열을 해시 한 다음 해시 값을 지문으로 사용하면됩니다.