c# - 변경 - 높은 품질과 낮은 품질, 픽셀 화 된 이미지 사이의 일치를 찾는 것은 가능합니까? 방법?



image algorithm (12)

IMHO, 가장 좋은 해결책은 두 이미지를 흐리게 처리 한 다음 나중에 상위 K (K = 5 일 수 있음) 선택을 위해 유사성 측정 (상관 / 상호 정보 등)을 사용하는 것입니다.

나는 문제가있다. 우리 회사는 나에게 지루한 작업을주었습니다. 우리는 두 개의 대화 상자 데이터베이스를 가지고 있습니다. 이 데이터베이스 중 하나에는 끔찍한 품질의 이미지와 다른 매우 높은 품질의 이미지가 포함되어 있습니다.

불행히도, 끔찍한 품질의 대화 상자에는 다른 정보에 대한 중요한 매핑이 포함되어 있습니다.

나는 수동으로, 모든 나쁜 이미지를 통과하고 그들을 좋은 이미지와 매치시켜야한다는 임무를 지니고있다.

이 프로세스를 어느 정도 자동화 할 수 있습니까? 다음은 Google 이미지에서 임의로 가져온 두 개의 대화 상자의 예입니다.

그래서 저는 현재 C #에서 프로그램을 작성하여 데이터베이스에서이 사진을 가져 와서 순환시키고 공통된 모양을 가진 사진을 찾고 자신의 ID를 반환합니다. 내 최고의 옵션은 무엇입니까?


Answer #1

개인적으로 이미지 해시 알고리즘을 사용하겠습니다.

이미지 해싱의 목표는 응축 된 표현을 얻기 위해 이미지 내용을 피처 시퀀스로 변환하는 것입니다. 이 특징 시퀀스 (즉, 비트 벡터)는 빠른 매칭을 위해 충분히 짧아야하고 유사성 측정이 가능할 수 있도록 구별 가능한 특징을 보존해야합니다.

오픈 소스 커뮤니티를 통해 자유롭게 사용할 수있는 몇 가지 알고리즘이 있습니다.

Neal Krawetz 박사가 Average Hash 알고리즘의 작동 방식을 보여주는 이 기사 에서 간단한 예제를 볼 수 있습니다.

  1. 크기 줄이기 . 고주파와 디테일을 제거하는 가장 빠른 방법은 이미지를 축소하는 것입니다. 이 경우 총 픽셀 수가 64가되도록 8x8로 축소하십시오. 종횡비를 유지하는 것을 괴롭히지 말고, 8x8 스퀘어에 맞게 낮추십시오. 이렇게하면 해시가 축척이나 종횡비에 관계없이 이미지의 모든 변형과 일치하게됩니다.
  2. 색상을 줄입니다 . 작은 8x8 사진이 회색 음영으로 변환됩니다. 그러면 해시가 64 픽셀 (64 빨간색, 64 녹색 및 64 파란색)에서 64 총 색상으로 변경됩니다.
  3. 평균 색상 . 64 색의 평균값을 계산하십시오.
  4. 비트를 계산하십시오 . 이것은 재미있는 부분입니다. 각 비트는 색상 값이 평균보다 높거나 낮은 지 여부에 따라 간단히 설정됩니다.
  5. 해시를 구축합니다 . 64 비트를 64 비트 정수로 설정하십시오. 일관성이있는 한 순서는 중요하지 않습니다. (big-endian을 사용하여 위에서 아래로 비트를 왼쪽에서 오른쪽으로 설정했습니다.)

David Oftedal 은 Average Hash 알고리즘을 사용하여 이미지를 분류하고 비교할 수있는 C # 명령 줄 응용 프로그램 을 작성했습니다. (나는 샘플 이미지로 그의 구현을 테스트했고 98.4 %의 유사성을 얻었다.)

이 솔루션의 주요 이점은 각 이미지를 한 번만 읽고 해시를 만들고 해밍 거리 와 같은 유사성에 따라 분류하는 것입니다.

이 방법으로 분류 단계에서 피쳐 추출 단계를 분리 할 수 ​​있습니다. 정확하지 않은 경우 다른 해싱 알고리즘으로 쉽게 전환 할 수 있습니다.

편집하다

간단한 예제를 here 찾을 수 있습니다 (40 개의 이미지로 구성된 테스트 세트가 포함되어 있으며 40/40 점수를 얻습니다).


Answer #2

나는 이런 식으로 할 것입니다 :

  • 흐려진 이미지가 어떻게 흐려 졌는지 이미 알고있는 경우 비교하기 전에 고화질 이미지에 동일한 기능을 적용하십시오.

    • 그런 다음 위에서 제안한 최소 자승법을 사용하여 이미지를 비교하십시오.
    • 가장 낮은 값은 당신에게 일치를 줄 것입니다. 두 이미지가 동일하면 이상적으로 0을 얻습니다.
    • 작업 속도를 높이려면 다운 샘플링 된 이미지에 대해 가장 많은 비교를 수행 한 다음 선택한 이미지의 하위 샘플을 수정하면됩니다.
  • 모르는 경우 다양한 가능성있는 기능 (JPEG 압축, 다운 샘플링 등)을 시도해보고 반복하십시오.


Answer #3

나는이 하이브리드 접근 방식이 특정 배치 일치 문제를 해결하는 것이 가장 좋을 것이라고 생각합니다.

  1. @ Paolo Morreti가 제안한 이미지 해싱 알고리즘 을 모든 이미지에 적용합니다.
  2. 한 집합의 각 이미지에 대해 해시가 가까운 거리에있는 이미지의 하위 집합을 찾습니다.
  3. 검색 공간을 줄이기 위해 @Running Wild 또는 @Raskolnikov가 제안한 값 비싼 매칭 방법을 적용 할 수 있습니다.

Answer #4

두 데이터베이스의 이미지를 동일한 대화 상자로 표시하고 이미지가 동일하지만 품질이 비슷해야합니다. 그런 다음 일치하는 이미지는 동일한 (또는 거의 동일한) 종횡비를 갖습니다.

저품질 이미지가 고화질 이미지 (또는 이와 동등한 이미지)에서 생성 된 경우 고화질 이미지의 전처리 단계와 동일한 이미지 처리 절차를 사용하여 저품질 이미지 데이터베이스와 일치시켜야합니다. 그러면 픽셀 별 비교 또는 히스토그램 매칭이 잘 작동합니다.

이미지가 많은 경우 이미지 매칭은 많은 리소스를 사용할 수 있습니다. 어쩌면 다중 패스 방식이 좋은 생각일까요? 예를 들면 다음과 같습니다 : 패스 1 : 이미지를 그룹화하기 위해 종횡비와 같은 단순 메스를 사용합니다 (db의 너비 및 높이 필드) (계산적으로 저렴) 통과 2 : 첫 번째 색상 채널 (또는 모든 채널)의 히스토그램에 일치 또는 그룹화 싼)

나는 또한 OpenCV를 추천 할 것이다. c, c ++ 및 Python (그리고 곧 Java)과 함께 사용할 수 있습니다.


Answer #5

러닝 와일드의 알고리즘을 정말 좋아합니다. 두 이미지를 더 비슷하게 만들 수 있다면 훨씬 더 효과적 일 수 있다고 생각합니다. 예를 들어 더 나은 이미지의 품질을 낮추면됩니다.


Answer #6

와일드의 답변을 실행하는 것은 매우 가깝습니다. 여기에서하는 일은 각 이미지 또는 PSNR에 대한 피크 신호 ​​대 노이즈 비율을 계산하는 것입니다. 귀하의 경우에는 Mean Squared Error 만 필요하지만 이미지의 제곱 구성 요소는 이미지 간의 차이를 계산하는 데 큰 도움이됩니다.

PSNR 참조

코드는 다음과 같아야합니다.

sum = 0.0
for(imageHeight){
  for(imageWidth){
    errorR = firstImage(r,x,y) - secondImage(r,x,y)
    errorG = firstImage(g,x,y) - secondImage(g,x,y)
    errorB = firstImage(b,x,y) - secondImage(b,x,y)
    totalError = square(errorR) + square(errorG) + square(errorB)
  }
  sum += totalError
}
meanSquaredError = (sum / (imageHeight * imageWidth)) / 3

Answer #7

워킹 평균 윈도우 (RGB 값)와 결합하여 윤곽 / 임계 값 기법을 시도해 보셨습니까?


Answer #8

이미지에서 윤곽선을 추출하는 경우 ShapeContext를 사용하여 매우 잘 일치하는 이미지를 얻을 수 있습니다.

ShapeContext는이 정확한 사물을위한 빌드입니다 (상호 모양을 기반으로 한 이미지 비교)

ShapeContext 구현 링크 : 원본 발행물 ShotContext에 대한 CodeProject 주제 페이지 의 goot ppt

* 임계 값이나 푸리에 변환과 같은 몇 가지 "윤곽 추출"기법을 사용해 보거나 윤곽 추출 에 관한CodeProject 페이지를 살펴볼 필요가 있습니다.

행운을 빕니다.


Answer #9

이미지의 픽셀 차이 만 계산하면 동일한 크기의 이미지 또는 수평 및 수직 방향에서 이미지의 크기를 조정하는 방법을 정확히 알고있는 경우에만 작동합니다. 또한 시프트 또는 회전 불변성도 없습니다.

따라서 픽셀 차이 측정법을 사용하는 것이 가장 간단한 형태의 문제 (이미지는 모든 특성에서 동일하지만 품질이 다르며 품질이 다른 이유는? jpeg 아티팩트 또는 단지 크기 조정?) 인 경우에만 사용하는 것이 좋습니다. 그렇지 않으면 정규화 된 상호 상관을 사용하면보다 안정적인 메트릭입니다. FFTW 나 OpenCV로 할 수 있습니다.


Answer #10

CBIR ( Content-Based Image Retrieval)을 시도해 볼 수 있습니다.

그것을 퉁명스럽게두기 위해서 :

  1. 데이터베이스의 모든 이미지에 대해 푸리에 변환을 사용하여 지문을 생성합니다.
  2. 원본 이미지를로드하고 이미지의 지문을 만듭니다.
  3. 원본과 데이터베이스의 모든 이미지 사이의 유클리드 거리를 계산합니다.
  4. 결과 정렬





pattern-matching