질문자 :Arnoud Buzing
이것은 주말 동안 저를 괴롭혔습니다. 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는 금전 등록기 옆에 있습니다):
왈도를 찾았습니다!
내가 해낸 방법
먼저 빨간색이 아닌 모든 색상을 필터링합니다.
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]]
Heike"이 작업을 수행하는 방탄 방법"(CIA가 줄무늬 셔츠와 같이 경쟁 요소가 없는 단일 이미지가 아니라 언제든지 위성 이미지에서 Waldo를 찾는 것을 생각하십시오)... 나는 Waldo의 많은 이미지에 대해 Boltzmann 기계를 훈련할 것입니다. - 앉기, 서기, 가리기 등의 모든 변형; 셔츠, 모자, 카메라, 모든 작품. Waldos의 큰 코퍼스는 필요하지 않지만(아마도 3-5개로 충분할 것입니다), 많을수록 좋습니다.
이것은 올바른 배열에서 발생하는 다양한 요소에 확률 구름을 할당한 다음 (분할을 통해) 평균 개체 크기를 설정하고 원본 이미지를 개별 사람과 가장 유사한 개체 셀로 분할합니다(가능한 폐색 및 포즈 변경 고려) ), 그러나 Waldo 사진에는 일반적으로 거의 같은 규모의 많은 사람들이 포함되어 있기 때문에 이것은 매우 쉬운 작업이어야 하며 사전 훈련된 Boltzmann 기계의 이러한 세그먼트에 공급해야 합니다. 그것은 당신에게 각각이 Waldo일 확률을 줄 것입니다. 가장 높은 확률로 하나를 가져 가라.
이것이 오늘날 OCR, 우편번호 판독기 및 무획 필기 인식이 작동하는 방식입니다. 기본적으로 당신은 답이 있다는 것을 알고 있고, 그것이 어떻게 보여야 하는지 어느 정도 알고, 다른 모든 것은 공통적인 요소를 가질 수 있지만 확실히 "그것이 아닙니다"이므로 "그것이 아닙니다"에 신경쓰지 않아도 됩니다. 가능한 모든 "이전에 본 것" 중에서 "그것"의 가능성을 살펴보십시오(예: 우편 번호에서 BM을 단 1초, 단 2초, 단 3초 등으로 훈련시킨 다음 각각 각 기계에 숫자를 할당하고 가장 자신 있는 것을 선택하십시오.) 이것은 모든 숫자의 단일 신경망 학습 기능보다 훨씬 더 잘 작동합니다.
Gregory Klopper임의의 이미지에서 Waldo(또는 관심 대상)를 찾는 일반적인 문제를 해결 하는 올바른 방법은 지도 머신 러닝 분류기를 훈련하는 것이라는 @GregoryKlopper의 의견에 동의합니다. 많은 양수 및 음수 레이블이 지정된 예제를 사용하여 Support Vector Machine , Boosted Decision Stump 또는 Boltzmann Machine과 같은 알고리즘을 훈련하여 이 문제에 대한 높은 정확도를 달성할 수 있습니다. Mathematica는 기계 학습 프레임워크 에 이러한 알고리즘을 포함하기도 합니다.
Waldo 분류기를 훈련할 때의 두 가지 문제는 다음과 같습니다.
- 올바른 이미지 특징 변환 결정. 이것은 @Heike의 대답이 유용한 곳입니다. 빨간색 필터와 벗겨진 패턴 감지기(예: 웨이블릿 또는 DCT 분해)는 원시 픽셀을 분류 알고리즘이 배울 수 있는 형식으로 바꾸는 좋은 방법입니다. 이미지의 모든 하위 섹션을 평가하는 블록 기반 분해도 필요합니다 ... 그러나 Waldo가 a) 항상 거의 같은 크기이고 b) 항상 각 이미지에 정확히 한 번 존재한다는 사실로 인해 더 쉽습니다.
- 충분한 교육 사례를 확보합니다. SVM은 각 클래스의 예가 100개 이상일 때 가장 잘 작동합니다. 부스팅의 상용 응용 프로그램(예: 디지털 카메라의 얼굴 초점 맞추기)은 수백만 개의 긍정적이고 부정적인 예에서 훈련됩니다.
빠른 Google 이미지 검색 은 좋은 데이터를 나타냅니다. 몇 가지 교육 예제를 수집하고 지금 바로 코딩하려고 합니다!
그러나 기계 학습 접근 방식(또는 @iND에서 제안한 규칙 기반 접근 방식)조차도 Waldos의 땅과 같은 이미지에 어려움을 겪을 것입니다 !
lubar나는 Mathematica를 모른다. . . 너무 나빠. 그러나 나는 대부분의 경우 위의 답변을 좋아합니다.
여전히 줄무늬에만 의존하여 답을 얻는 데는 큰 결함이 있습니다 (개인적으로 한 번의 수동 조정에는 문제가 없습니다). 그들이 때때로 셔츠 패턴을 깨뜨리는 것을 보여주는 예(여기 에 Brett Champion이 나열함)가 있습니다. 그러면 더 복잡한 패턴이 됩니다.
나는 공간적 관계와 함께 모양 id와 색상의 접근을 시도할 것입니다. 얼굴 인식과 마찬가지로 서로 특정 비율의 기하학적 패턴을 찾을 수 있습니다. 주의할 점은 일반적으로 이러한 모양 중 하나 이상이 가려져 있다는 것입니다.
이미지에서 화이트 밸런스를 얻고 이미지에서 레드 밸런스를 얻습니다. 나는 Waldo가 항상 같은 값/색조라고 생각하지만 이미지는 스캔에서 나온 것일 수도 있고 잘못된 사본일 수도 있습니다. 그런 다음 항상 Waldo가 실제로 가지고 있는 색상 배열을 참조하십시오: 빨강, 흰색, 짙은 갈색, 파랑, 복숭아, {신발 색상}.
셔츠 패턴이 있으며 Waldo를 정의하는 바지, 안경, 머리, 얼굴, 신발 및 모자도 있습니다. 또한, 이미지 속 다른 사람들에 비해 왈도는 마른 편이다.
따라서 이 사진에서 사람들의 키를 얻기 위해 임의의 사람들을 찾으십시오. 이미지의 임의 지점에서 여러 사물의 평균 높이를 측정합니다(간단한 윤곽선으로 꽤 많은 개별 사람이 생성됨). 각 것이 서로의 표준 편차 내에 있지 않으면 지금은 무시됩니다. 높이의 평균을 이미지의 높이와 비교합니다. 비율이 너무 크면(예: 1:2, 1:4 또는 유사하게 비슷한 경우) 다시 시도하십시오. 10(?) 번 실행하여 일부 표준 편차를 벗어나는 평균을 제외하고 샘플이 모두 서로 매우 가깝게 있는지 확인합니다. Mathematica에서 가능합니까?
이것은 Waldo 사이즈입니다. W 또한 마른 체형이므로 5:1 또는 6:1(또는 무엇이든) ht:wd를 찾고 있습니다. 그러나 이것으로는 충분하지 않습니다. Waldo가 부분적으로 숨겨져 있으면 높이가 변경될 수 있습니다. 따라서 ~2:1의 적백색 블록을 찾고 있습니다. 그러나 더 많은 지표가 있어야 합니다.
- Waldo는 안경을 쓰고 있습니다. 빨간색-흰색 위에 0.5:1로 두 개의 원을 검색합니다.
- 파란 바지. 적백의 끝과 발까지의 거리 사이의 거리 내에서 동일한 너비의 모든 양의 파란색. 그는 셔츠를 짧게 입기 때문에 발이 너무 가깝지 않습니다.
- 모자. 머리 꼭대기의 두 배까지 거리에 관계없이 적백색. 아래에 검은 머리카락이 있어야하며 아마도 안경이어야합니다.
- 긴 소매. 메인 레드 화이트에서 약간의 각도에서 레드 화이트.
- 검은 머리.
- 신발 색상입니다. 색상을 모르겠습니다.
그 중 아무거나 신청할 수 있습니다. 이것은 또한 사진에 있는 유사한 사람들에 대한 부정 검사입니다. 예를 들어 #2는 빨간색 흰색 앞치마를 착용하는 것을 부정하고(신발에 너무 가깝게) #5는 밝은 색 머리카락을 제거합니다. 또한 모양은 이러한 각 테스트에 대한 하나의 지표일 뿐입니다. . . 지정된 거리 내에서 색상만 사용하면 좋은 결과를 얻을 수 있습니다.
이렇게 하면 처리할 영역이 좁아집니다.
이 결과를 저장하면 Waldo가 있어야 하는 영역 집합이 생성됩니다. 다른 모든 영역을 제외하고(예: 각 영역에 대해 평균 사람 크기의 2배 큰 원을 선택), @Heike가 빨간색을 제외한 모든 영역을 제거하는 등으로 계획한 프로세스를 실행합니다.
이것을 코딩하는 방법에 대한 생각이 있습니까?
편집하다:
이것을 코딩하는 방법에 대한 생각. . . Waldo red를 제외한 모든 영역을 제외하고 빨간색 영역을 골격화한 다음 단일 지점으로 잘라냅니다. Waldo 머리 갈색, Waldo 바지 파란색, Waldo 신발 색상에 대해 동일한 작업을 수행합니다. Waldo 피부색의 경우 제외하고 윤곽선을 찾습니다.
다음으로, 빨간색이 아닌 부분을 제외하고 모든 빨간색 영역을 확장(많이)한 다음 골격화하고 가지치기합니다. 이 부분은 가능한 Waldo 중심점 목록을 제공합니다. 이것은 다른 모든 Waldo 색상 섹션을 비교할 마커가 됩니다.
여기에서 골격화된 빨간색 영역(확장된 영역이 아님)을 사용하여 각 영역의 선을 계산합니다. 정확한 숫자(4, 맞나요?)가 있다면 이것은 확실히 가능한 영역입니다. 그렇지 않다면 나는 그것을 제외할 것 같다(Waldo 센터이기 때문에 ... 여전히 그의 모자일 수 있음).
그런 다음 위에 얼굴 모양이 있는지, 위에 머리 포인트가 있는지, 아래에 바지 포인트가, 아래에 신발 포인트가 있는지 확인합니다.
아직 코드가 없습니다. 여전히 문서를 읽고 있습니다.
iNDOpenCV를 사용하여 Waldo를 찾는 빠른 솔루션이 있습니다.
나는 Waldo를 찾기 위해 OpenCV에서 사용할 수 있는 템플릿 매칭 기능을 사용했습니다.
이를 위해서는 템플릿이 필요합니다. 그래서 원본 이미지에서 Waldo를 잘라서 템플릿으로 사용했습니다.
다음으로 정규화된 상관 계수 와 함께 사용된 방법으로 cv2.matchTemplate()
아래 흰색(왼쪽 상단 영역 어딘가)과 같이 단일 영역에서 높은 확률을 반환했습니다.
가장 가능성이 높은 영역의 위치는 cv2.minMaxLoc()
함수를 사용하여 찾은 다음 Waldo를 강조 표시하기 위해 사각형을 그리는 데 사용했습니다.
Jeru Luke출처 : http:www.stackoverflow.com/questions/8479058/how-do-i-find-waldo-with-mathematica