이미지 모자이크를 만들기위한 알고리즘-이것보다 빠른 방법이 있습니까?


9

나는 이미지 모자이크를 만들면서 놀고 있습니다. 내 스크립트는 많은 수의 이미지를 가져 와서 축소판 크기로 축소 한 다음 대상 이미지와 비슷한 타일로 사용합니다.

이 접근법은 실제로 매우 즐겁습니다.

모든 타일 위치의 모든 엄지 손가락에 대한 평균 제곱 오류를 계산합니다.

처음에는 욕심 많은 배치를 사용했습니다. 가장 적합한 타일에 엄지 손가락을 넣고 그다음에 다음과 같이하십시오.

욕심 많은 문제는 가장 인기있는 타일에 가장 다른 엄지 손가락을 배치하는 것입니다. 나는 여기에 예를 보여줍니다 : http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics

그런 다음 스크립트가 중단 될 때까지 임의의 스왑을 수행합니다. 결과는 아주 좋습니다.

두 타일의 랜덤 스왑이 항상 개선되는 것은 아니지만 때로는 세 개 이상의 타일이 회전하면 전체적으로 개선됩니다. 즉 A <-> B, 개선되지 않을 A -> B -> C -> A1수도 있지만 ..

이러한 이유로 두 개의 임의 타일을 선택하고 개선되지 않는 것을 발견 한 후에는 이러한 회전에서 세 번째 타일이 될 수 있는지 평가하기 위해 타일을 선택합니다. 4 개의 타일 세트가 수익성있게 회전 할 수 있는지 여부는 탐색하지 않습니다. 그것은 곧 매우 비싸다.

그러나 이것은 시간이 걸린다. 많은 시간!

더 좋고 빠른 접근 방법이 있습니까?


바운티 업데이트

헝가리어 메소드 의 다양한 Python 구현 및 바인딩을 테스트했습니다 .

순수한 파이썬 https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py 가 가장 빠릅니다.

내 직감은 이것이 최적의 대답에 가깝다는 것입니다. 테스트 이미지에서 실행하면 다른 모든 라이브러리가 결과에 동의했지만이 kuhnMunkres.py는 수십 배 빠르지 만 다른 구현에서 동의 한 점수와 매우 근접했습니다.

속도는 데이터에 매우 의존적입니다. 모나리자는 13 분 만에 kuhnMunkres.py를 돌파했지만 스칼렛 체스트 잉꼬는 16 분이 걸렸습니다.

결과는 잉꼬에 대한 무작위 스왑 및 회전과 거의 동일합니다.

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

(왼쪽의 kuhnMunkres.py, 오른쪽의 임의 스왑; 비교를위한 원본 이미지 )

그러나 내가 테스트 한 Mona Lisa 이미지의 경우 결과가 눈에 띄게 개선되었으며 실제로 그녀는 정의 된 '미소'를 통해 빛났습니다.

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

(왼쪽의 kuhnMunkres.py, 오른쪽의 임의 스왑)


1
관련 ... ish. Codegolf 구개 변환 에서 비슷한 문제가 발생했습니다.

1
그리고 또 다른 관련 이미지 세트는 allRGB 이며 각 이미지는 어떻게 수행 하는지 에 대한 힌트를 많이 제공하지는 않지만 이 문제에 접근 한 다른 영역이 있다는 것입니다.

1
나는 몇 년 전에 모자이크 제작자와이 문제에 부딪쳤다. 그때 내 추론은 알고리즘 (MSE 부분)이 아니라 입력 이미지 팔레트의 제한된 크기에 문제가 있다는 것입니다. 수십억 개의 이미지를 사용할 수 없었기 때문에 일정 시간이 지난 후에 이미지를 재사용 할 수있게하여 이미지를 위조했습니다. 그러나 접근 방식을 유지하려면 "양호한"적합을 위해 첫 번째 패스를 수행 한 다음 나머지 이미지를 임의의 (또는 임의의) 이미지로 처리하는 것이 좋습니다. 너무 많은 선택.
J Trana

@MichaelT 그 훌륭한 링크에 감사드립니다 :) codegolf는 특히 매력적입니다. 최고의 투표 솔루션은 랜덤 스왑 (랜덤 회전이 아님)을 사용하고 있으며 아마도 꽤 오랫동안 실행되고있을 것입니다 ...
Will

1
당신이 답변을 선택하고 현상금을 수여 한 후 이것에 온다. 다른 접근법은 이것을 시뮬레이트 어닐링 문제 로 취급하는 것 입니다. SA를 솔루션 파이프 라인의 단계 중 하나로 사용할 수 있습니다.
andy256

답변:


3

그렇습니다. 더 좋고 빠른 두 가지 접근 방식이 있습니다.

  • 더 간단한 문제 : 각 타일마다 가능한 가장 좋은 엄지 손가락을 선택하십시오 (중복 가능). 좋아, 그것은 속임수이지만 더 나은 시각적 결과로 이어질 수 있습니다.
  • 귀하의 테이크는 알고리즘 적으로 더 흥미롭고 MSE를 합계가 최소 여야하는 일치 비용으로 가정하면 "선형 할당 문제"로 귀결됩니다. 이러한 문제는 예를 들어 "헝가리어 방법"을 통해 다항식 시간으로 해결할 수 있습니다.

그런 다음 기본 알고리즘을 변경하지 않고도 MSE를 시각적으로 정확한 거리로 대체하여 비용을 조정할 수 있습니다.


고마워! 랩과 헝가리어 방법이 내가 필요한 리드였습니다! 문제의 결과로 업데이트하십시오.

3

나는 그것이 NP-hard 문제라고 합리적으로 확신합니다. '완벽한'솔루션을 찾으려면 모든 가능성을 철저히 시도해야하며 이는 지수입니다.

한 가지 방법은 탐욕스러운 착용감을 사용하고 개선하려고 노력하는 것입니다. 잘못 배치 된 이미지 (마지막 이미지 중 하나)를 가져 와서 배치 할 다른 장소를 찾은 다음 이미지를 가져 와서 이동하는 등의 작업이 가능합니다. (a) 시간이 부족하면 (b) 적합이 '충분히'적합 할 때 수행됩니다.

확률 적 요소를 도입하면 시뮬레이션 어닐링 방식 또는 유전자 알고리즘 이 생성 될 수 있습니다 . 아마도 당신이 달성하려는 것은 오류를 고르게 퍼뜨리는 것입니다. 나는 이것이 당신이 이미하고있는 것에 가까워지고 있다고 생각합니다. 올바른 알고리즘으로 더 나은 결과를 얻을 수는 있지만 너바나에 대한 마술 지름길은 없습니다.


예, 이것은 당신이 이미하고있는 것과 유사합니다. 요점은 마법의 대답을 잊고 두 알고리즘의 관점에서 생각하는 것입니다 : 먼저 채운 다음 최적화하십시오.

채우기는 다음과 같습니다. 무작위, 최고 사용 가능, 첫 번째 최고, 충분, 일종의 핫스팟.

최적화는 무작위 적이거나, 최악의 문제를 해결하거나, 시뮬레이트 된 어닐링 또는 유전자 알고리즘 일 수 있습니다.

당신은 '좋은 것'의 척도와 그것을 소비하고 실험하기 위해 준비된 시간이 필요합니다. 아니면 실제로 한 사람을 찾으십시오.


당신은 질문에 설명 된 접근 방식을 정확하게 설명합니다 ...?

1

마지막 타일이 문제라면 어떻게 든 일찍 배치해야합니다.)

한 가지 접근 방식은 일치하는 상위 x %에서 가장 먼 타일을보고 (직관적으로 33 %를 사용함) 가장 잘 일치시키는 것입니다. 그것은 어쨌든 얻을 수있는 가장 좋은 경기입니다.

또한 최악의 타일에 대해 최상의 일치를 사용하지 않도록 선택할 수 있지만 해당 슬롯에 대한 최상의 일치에 비해 오류가 가장 적은 타일을 사용하여 " 피해 관리 ".

명심해야 할 또 다른 것은 결국 눈으로 처리 할 이미지를 생성한다는 것입니다. 따라서 실제로 원하는 것은 가장자리 감지 기능을 사용하여 이미지에서 가장 중요한 위치를 결정하는 것입니다. 유사하게, 이미지의 가장 주변에서 일어나는 것은 효과의 품질에 거의 가치가 없습니다. 이 두 가중치를 겹쳐서 거리 계산에 포함시킵니다. 따라서 모든 지터는 경계를 향하여 가장자리에서 멀어 지므로 덜 방해해야합니다.

또한 가장자리 감지 기능을 사용하면 첫 번째 y %를 탐욕스럽게 배치 할 수 있습니다 (왼쪽 타일의 특정 "부드러움"임계 값 아래로 떨어질 때까지). 그런 다음 나머지는 "손상 제어"로 전환하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.