기하학적 프리미티브로 이미지를 재현합니다.
대상 이미지가 입력으로 제공됩니다. 이 알고리즘은 대상 이미지와 그린 이미지 사이의 오류를 최소화하기 위해 그릴 수있는 가장 최적의 단일 모양을 찾으려고합니다. 한 번에 하나의 모양을 추가 하여이 과정을 반복합니다. 인식 할 수 있지만 예술적이고 추상적 인 결과에 도달하려면 약 50 ~ 200 개의 모양이 필요합니다.
이제 기본 MAC 응용 프로그램으로 제공됩니다!
https://primitive.lol/
트위터에서 @primitivepic을 팔로우하여 30 분마다 새로운 원시 사진을보십시오!
Twitter Bot은 Flickr API를 사용하여 흥미로운 사진을 찾고 무작위 매개 변수를 사용하여 알고리즘을 실행하며 Twitter API를 사용하여 사진을 게시합니다.
봇에 사진을 트윗 할 수 있으며 처리 할 수 있습니다.
자신의 이미지로 실행하십시오! 먼저 GO를 설치하십시오.
go get -u github.com/fogleman/primitive
primitive -i input.png -o output.png -n 100
작은 입력 이미지를 사용해야합니다 (256x256px). 어쨌든 세부 사항이 필요하지 않으면 코드가 더 빨리 실행됩니다.
깃발 | 기본 | 설명 |
---|---|---|
i | N/A | 입력 파일 |
o | N/A | 출력 파일 |
n | N/A | 모양의 수 |
m | 1 | 모드 : 0 = 콤보, 1 = 삼각형, 2 = rect, 3 = 타원, 4 = 원, 5 = RotatedRect, 6 = Beziers, 7 = RotatedEllipse, 8 = 다각형 |
rep | 0 | 감소 된 검색으로 각 반복을 추가로 추가하십시오 (대부분 베 지어에게 좋습니다) |
nth | 1 | 모든 n 번째 프레임 저장 ( %d 출력 경로에있을 때만) |
r | 256 | 처리하기 전에 큰 입력 이미지를이 크기로 크기를 조정하십시오 |
s | 1024 | 출력 이미지 크기 |
a | 128 | 색상 알파 (알고리즘이 각 모양에 대해 알파를 선택하도록하기 위해 0 사용하십시오) |
bg | avg | 시작 배경 (16 진) |
j | 0 | 평행 작업자 수 (기본값 모든 코어 사용) |
v | 끄다 | 동점 출력 |
vv | 끄다 | 매우 장점 생산량 |
제공된 출력 파일 이름 확장에 따라 다양한 유형의 출력을 생성 할 수 있습니다.
PNG
: 래스터 출력JPG
: 래스터 출력SVG
: 벡터 출력GIF
: 추가되는 모양을 보여주는 애니메이션 출력 - Imagemagick (특히 convert
Command)가 필요합니다. PNG 및 SVG 출력의 경우 파일 이름에 %d
, %03d
등을 포함 할 수도 있습니다. 이 경우 각 프레임은 별도로 저장됩니다.
-o
플래그를 여러 번 사용할 수 있습니다. 이렇게하면 예를 들어 PNG와 SVG를 모두 저장할 수 있습니다.
이 GIF는 한 번에 한 가지 모양을 추가하여 평균 제곱 오차를 최소화하려고 시도하여 알고리즘의 반복적 특성을 보여줍니다. ( ".gif"출력 파일을 사용하여 직접 생성하십시오!)
알고리즘에는 임의의 구성 요소가 있으므로 동일한 입력 이미지에 대해 여러 번 실행하여 정적 이미지로 생명을 불어 넣을 수 있습니다.
코드에 기꺼이 손질하려는 경우 모양에 대한 제약을 시행하여 더 흥미로운 결과를 생성 할 수 있습니다. 여기서, 사각형은 피라미드 일몰 의이 그림에서 태양을 향한 것으로 제한되어 있습니다.
아래 행렬은 각각 50, 100 및 200 반복의 삼각형, 타원 및 사각형을 보여줍니다.
Target Image
가 있다고 가정합니다. 이것이 우리가 재현을 위해 노력하는 것입니다. 우리는 빈 캔버스로 시작하지만 단일 단색으로 채 웁니다. 현재 이것은 Target Image
의 평균 색상입니다. 우리는 이것을 새로운 빈 캔버스를 Current Image
라고 부릅니다. 이제 우리는 모양을 평가하기 시작합니다. 모양을 평가하기 위해 Current Image
위에 그려서 New Image
생성합니다. 이 New Image
Target Image
와 비교하여 점수를 계산합니다. 우리는 점수에 루트 평균 제곱 오류를 사용합니다.
Current Image + Shape => New Image
RMSE(New Image, Target Image) => Score
모양은 무작위로 생성됩니다. 우리는 임의의 모양을 생성하고 점수를 매길 수 있습니다. 그런 다음 (삼각형 정점을 조정하고, 타원 반경 또는 중앙을 조정하여) 모양을 돌연변이 할 수 있고 다시 점수를 매길 수 있습니다. 돌연변이가 점수를 향상 시키면 우리는 그것을 유지합니다. 그렇지 않으면 우리는 이전 상태로 롤백합니다. 이 과정을 반복하는 것은 언덕 등반이라고합니다. 언덕 등반은 지역 최소값에 갇히기 쉽기 때문에 실제로 여러 가지 시작 모양으로 여러 시간을합니다. 우리는 또한 무작위 모양을 생성하고 언덕 등반을 시작하기 전에 최고의 모양을 선택할 수 있습니다. 시뮬레이션 된 어닐링은 또 다른 좋은 선택이지만, 테스트에서 나는 적어도이 특정 문제에 대해 언덕 등반 기술이 좋고 더 빠릅니다.
좋은 점수 모양을 발견하면 Current Image
에 추가하여 변경되지 않은 상태로 추가됩니다. 그런 다음 프로세스를 다시 시작하여 다음 모양을 찾을 수 있습니다. 이 과정은 원하는만큼 반복됩니다.
다음과 같은 프리미티브가 지원됩니다.
다음 인터페이스를 구현하여 더 많은 모양을 추가 할 수 있습니다.
type Shape interface {
Rasterize () [] Scanline
Copy () Shape
Mutate ()
Draw ( dc * gg. Context )
SVG ( attrs string ) string
}
이 프로젝트는 원래 Roger Johansson -Genetic Programming : Evolution of Mona Lisa의 인기 있고 훌륭한 작품에서 영감을 받았습니다. 그 기사가 아주 새롭었을 때이 기사를 본 이후, 나는이 문제를 몇 년 동안 여기저기서 땜질했습니다. 하지만 지금은 내 결과에 만족합니다.
Roger의 원래 작업에 비해 내 구현에 상당한 차이가 있음에 주목해야합니다. 광산은 유전자 알고리즘이 아닙니다. 광산은 한 번에 한 가지 모양으로 만 작동합니다. 광산은 훨씬 빠르며 (AFAIK) 많은 유형의 모양을 지원합니다.
다음은 Flickr에서 발견 된 흥미로운 사진의 더 많은 예입니다.