[image-processing] Mathematica와 함께 Waldo를 어떻게 찾습니까?

이것은 주말 동안 나를 괴롭 혔습니다. Waldo는 어디에 있습니까? [ 북미 이외의 ‘Wally’ ] Mathematica (이미지 처리 및 기타 기능)를 사용하는 퍼즐?

여기 내가 지금까지 가지고있는 것, 빨간색이 아닌 색상 중 일부를 흐리게하여 시각적 복잡성을 약간 줄이는 기능입니다.

whereIsWaldo[url_] := Module[{waldo, waldo2, waldoMask},
    waldo = Import[url];
    waldo2 = Image[ImageData[
        waldo] /. {{r_, g_, b_} /;
          Not[r > .7 && g < .3 && b < .3] :> {0, 0,
          0}, {r_, g_, b_} /; (r > .7 && g < .3 && b < .3) :> {1, 1,
          1}}];
    waldoMask = Closing[waldo2, 4];
    ImageCompose[waldo, {waldoMask, .5}]
]

그리고 이것이 작동하는 URL의 예 :

whereIsWaldo["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"]

(왈도는 금전 등록기입니다) :

원본 이미지

매스 매 티카 그래픽



답변

왈도를 찾았습니다!

왈도 발견

어떻게했는지

먼저, 빨간색이 아닌 모든 색상을 걸러냅니다

waldo = Import["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"];
red = Fold[ImageSubtract, #[[1]], Rest[#]] &@ColorSeparate[waldo];

다음으로 셔츠에서 빨간색과 흰색 전환을 찾기 위해 간단한 흑백 패턴으로이 이미지의 상관 관계를 계산합니다.

corr = ImageCorrelate[red,
   Image@Join[ConstantArray[1, {2, 4}], ConstantArray[0, {2, 4}]],
   NormalizedSquaredEuclideanDistance];

내가 사용 Binarize충분히 높은 상관 관계를 사용하여 이미지의 픽셀을 선택하고 사용을 강조하기 위해 주위에 흰색 원을 그립니다Dilation

pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];

나는 레벨에서 조금 놀아야했다. 레벨이 너무 높으면 너무 많은 오 탐지가 선택됩니다.

마지막 으로이 결과를 원본 이미지와 결합하여 위의 결과를 얻습니다.

found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]


답변

는 “이 작업을 수행하는 방탄 방법”에 내 생각은 (CIA 스트라이프 셔츠와 같은 요소를 경쟁없이 위성 영상에 언제든지, 단지 하나의 이미지를 왈도를 찾는 생각) … 나는 훈련 것 볼츠만 기계를 왈도의 많은 이미지에 -앉거나 서 있거나 폐색 된 그의 모든 변형; 셔츠, 모자, 카메라 및 모든 작품. 큰 규모의 Waldos 모음이 필요하지는 않지만 (3-5 정도면 충분 함) 더 좋습니다.

이것은 올바른 배열이 무엇이든 발생하는 다양한 요소에 확률의 구름을 할당 한 다음 평균 객체 크기가 무엇인지 (세그먼트 화를 통해) 소스 이미지를 개별 사람들과 가장 유사한 객체의 셀로 조각화합니다 (가능한 폐색을 고려하고 변경 사항을 포즈합니다) ), 그러나 Waldo 사진에는 일반적으로 거의 같은 규모의 사람들이 많이 포함되어 있기 때문에 이것은 매우 쉬운 작업이어야하며 사전 훈련 된 Boltzmann 기계 의이 세그먼트에 공급하십시오. 각각의 왈도 일 가능성이 있습니다. 확률이 가장 높은 것을 복용하십시오.

오늘날 OCR, 우편 번호 리더 및 획없는 필기 인식이 작동하는 방식입니다. 기본적으로 당신은 답이 있다는 것을 알고, 그것이 어떻게 생겼는지 알고, 다른 모든 것에는 공통 요소가있을 수 있지만 확실히 “그렇지 않습니다”, “그렇지 않다”를 귀찮게하지 않습니다. 예를 들어, 우편 번호에서 BM을 1 초, 2 초, 3 초 등으로 훈련시킨 다음 각각을 먹이십시오. 각 머신에 숫자를 입력하고 가장 신뢰하는 머신을 선택하십시오.) 이것은 모든 숫자의 단일 신경망 학습 기능보다 훨씬 효과적입니다.


답변

@GregoryKlopper에 동의합니다 . 임의의 이미지에서 Waldo (또는 관심있는 대상)를 찾는 일반적인 문제를 해결 하는 올바른 방법은 감독되는 기계 학습 분류기를 훈련시키는 것입니다. 많은 양수 및 음수 레이블이 지정된 예제를 사용하면 Support Vector Machine , Boosted Decision Stump 또는 Boltzmann Machine 과 같은 알고리즘 을 사용 하여이 문제에 대한 정확성을 높일 수 있습니다. Mathematica는 이러한 알고리즘을 기계 학습 프레임 워크에 포함 합니다.

Waldo 분류기를 훈련시키는 데있어 두 가지 과제는 다음과 같습니다.

  1. 올바른 이미지 기능 변환 결정 이것은 @Heike의 대답이 유용한 곳입니다. 빨간 필터와 스트리핑 패턴 검출기 (예 : 웨이블릿 또는 DCT 분해)는 원시 픽셀을 분류 알고리즘이 배울 수있는 형식으로 바꾸는 좋은 방법입니다. 이미지의 모든 하위 섹션을 평가하는 블록 기반 분해도 필요하지만 … Waldo는 a) 항상 거의 같은 크기이며 b) 각 이미지에서 항상 정확히 한 번만 존재한다는 사실로 인해 더 쉬워졌습니다.
  2. 충분한 훈련 예를 얻는 것. SVM은 각 클래스의 최소 100 개의 예에서 가장 잘 작동합니다. 부스팅 (예 : 디지털 카메라의 얼굴 포커싱)의 상용 응용 프로그램은 수백만 건의 긍정적 및 부정적 사례에 대한 교육을 받았습니다.

Google 이미지를 빠르게 검색하면 좋은 데이터가 나타납니다. 지금은 몇 가지 교육 예제를 수집하여 코드를 작성해 보겠습니다.

그러나 기계 학습 접근법 (또는 @iND가 제안한 규칙 기반 접근법) 조차도 Waldos Land 와 같은 이미지를 위해 어려움을 겪을 것입니다 !


답변

나는 Mathematica를 모른다. . . 너무 나쁘다. 그러나 나는 위의 답변을 대부분 좋아합니다.

여전히 답을 얻기 위해 줄무늬 에만 의존하는 데 큰 결함이 있습니다 (개인적으로 하나의 수동 조정에 문제가 없습니다 ). 셔츠 패턴이 때때로 깨지는 것을 보여주는 예제 ( 여기 Brett Champion에 의해 등재 됨 )가 제시되어 있습니다. 따라서 더 복잡한 패턴이됩니다.

나는 공간적 관계와 함께 모양의 id와 색상의 접근을 시도 할 것입니다. 얼굴 인식과 마찬가지로 특정 비율의 기하학적 패턴을 찾을 수 있습니다. 주의 할 점은 일반적으로 이러한 모양 중 하나 이상이 가려져 있다는 것입니다.

이미지에서 화이트 밸런스를 얻고 이미지에서 레드 밸런스를 빨간색으로 만듭니다. Waldo는 항상 같은 값 / 색조라고 생각하지만 이미지가 스캔되었거나 잘못된 사본 일 수 있습니다. 그런 다음 항상 Waldo가 실제로 빨간색, 흰색, 짙은 갈색, 파란색, 복숭아, {구두 색}의 색상 배열을 참조하십시오.

셔츠 패턴과 Waldo를 정의하는 바지, 안경, 머리카락, 얼굴, 신발 및 모자가 있습니다. 또한 이미지의 다른 사람들과 비교하여 Waldo는 마른쪽에 있습니다.

따라서이 그림에서 사람들의 키를 얻으려면 임의의 사람들을 찾으십시오. 이미지의 임의의 지점에서 여러 물건의 평균 높이를 측정하십시오 (단순한 윤곽선으로 인해 많은 사람들이 생길 수 있습니다). 각 것이 서로 표준 편차 내에 있지 않으면 지금은 무시됩니다. 높이의 평균을 이미지의 높이와 비교하십시오. 비율이 너무 크면 (예 : 1 : 2, 1 : 4 또는 이와 비슷하게) 다시 시도하십시오. 표준 편차를 벗어난 평균을 제외하고 10 (?) 번 반복하여 표본이 모두 서로 가깝게 있는지 확인하십시오. Mathematica에서 가능합니까?

이것은 당신의 왈도 크기입니다. Walso는 마른 체형이므로 5 : 1 또는 6 : 1 (또는 무엇이든) ht : wd를 찾고 있습니다. 그러나 이것으로는 충분하지 않습니다. Waldo가 부분적으로 숨겨져 있으면 높이가 변경 될 수 있습니다. 그래서, 당신은 ~ 2 : 1의 적 백색 블록을 찾고 있습니다. 그러나 더 많은 지표가 있어야합니다.

  1. 왈도에는 안경이 있습니다. 적 백색 위의 0.5 : 1 원 2 개를 검색합니다.
  2. 파란 바지. 적 백색의 끝과 발까지의 거리 사이의 거리 내에서 동일한 너비의 파란색. 그는 셔츠를 짧게 입어서 발이 너무 가까이 있지 않습니다.
  3. 모자. 머리 위쪽의 최대 두 배까지 거리는 적 백색입니다. 아래에 검은 머리가 있고 안경일 것입니다.
  4. 긴 소매. 주 적 백색에서 일정 각도로 적 백색.
  5. 검은 머리.
  6. 신발 색. 나는 색깔을 모른다.

그중 하나라도 적용 할 수 있습니다. 이것들은 또한 그림에서 비슷한 사람들에 대한 부정적인 점검입니다. 또한 모양은 이러한 각 테스트마다 하나의 지표입니다. . . 지정된 거리 내의 색상만으로도 좋은 결과를 얻을 수 있습니다.

처리 할 영역이 좁아집니다.

이러한 결과를 저장하는 것은 지역의 집합 생산할 예정 한다 그것에서 왈도을 가지고 있습니다. 다른 모든 영역을 제외하고 (예 : 각 영역에 대해 평균 사람 크기의 두 배 큰 원을 선택) @Heike가 빨간색을 제외한 나머지를 모두 제거하여 배치 한 프로세스를 실행하십시오.

이것을 코딩하는 방법에 대한 생각이 있습니까?


편집하다:

이것을 코딩하는 방법에 대한 생각. . . 왈도 레드 이외의 모든 영역을 제외하고, 레드 영역을 골격 화하고 단일 지점까지 프룬합니다. 왈도 머리 갈색, 왈도 바지 파란색, 왈도 신발 색상에 대해서도 동일하게 수행하십시오. Waldo 피부색의 경우 제외하고 윤곽선을 찾으십시오.

다음으로, 빨간색이 아닌 것을 제외하고 모든 빨간색 영역을 확장 한 다음 골격 화하고 정리합니다. 이 부분은 가능한 Waldo 중심점 목록을 제공합니다. 다른 모든 Waldo 색상 섹션을 비교하는 마커가됩니다.

여기에서 골격 화 된 빨간색 영역 (확장 영역이 아닌)을 사용하여 각 영역의 선 수를 계산하십시오. 정확한 숫자가 있다면 (4, 맞습니까?) 이것은 확실히 가능한 영역입니다. 그렇지 않다면, 나는 그것을 제외시킬 것입니다 (Waldo 센터 …. 그것이 여전히 그의 모자 일 수 있습니다).

그런 다음 위의 얼굴 모양, 위의 헤어 포인트, 아래의 바지 포인트, 아래의 구두 포인트 등이 있는지 확인하십시오.

아직 코드가 없습니다. 여전히 문서를 읽고 있습니다.


답변

OpenCV를 사용하여 Waldo를 찾는 빠른 솔루션이 있습니다.

내가 사용하는 템플릿 매칭 왈도을 찾기 위해 OpenCV의에서 사용할 기능을.

이를 위해서는 템플릿이 필요합니다. 그래서 원래 이미지에서 Waldo를 자르고 템플릿으로 사용했습니다.

여기에 이미지 설명을 입력하십시오

다음으로 나는 cv2.matchTemplate()함수와 함께 사용 된 방법으로 정규화 된 상관 계수 . 아래의 흰색 (왼쪽 위 영역)에 표시된 것처럼 단일 영역에서 높은 확률을 반환했습니다.

여기에 이미지 설명을 입력하십시오

가장 가능성이 높은 영역의 위치는 cv2.minMaxLoc()함수를 사용하여 찾은 다음 Waldo를 강조 표시하기 위해 사각형을 그리는 데 사용되었습니다.

여기에 이미지 설명을 입력하십시오


답변