การทำซ้ำรูปภาพด้วยรูปทรงเรขาคณิตดั้งเดิม
ภาพเป้าหมายมีให้เป็นอินพุต อัลกอริทึมพยายามค้นหารูปร่างที่ดีที่สุดเดียวที่สามารถวาดเพื่อลดข้อผิดพลาดระหว่างภาพเป้าหมายและภาพวาด มันทำซ้ำกระบวนการนี้เพิ่ม ทีละรูปร่าง จำเป็นต้องมีรูปร่างประมาณ 50 ถึง 200 รูปแบบเพื่อให้ได้ผลลัพธ์ที่เป็นที่รู้จัก แต่ยังมีศิลปะและเป็นนามธรรม
ตอนนี้มีให้เป็นแอปพลิเคชัน MAC ดั้งเดิม!
https://primitive.lol/
ติดตาม @primitivepic บน Twitter เพื่อดูภาพดั้งเดิมใหม่ทุก ๆ 30 นาที!
บอท Twitter มองหาภาพถ่ายที่น่าสนใจโดยใช้ Flickr API ใช้อัลกอริทึมโดยใช้พารามิเตอร์แบบสุ่มและโพสต์รูปภาพโดยใช้ Twitter API
คุณสามารถทวีตรูปภาพไปที่บอทและมันจะประมวลผลให้คุณ
เรียกใช้กับภาพของคุณเอง! ก่อนอื่นติดตั้งไป
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 | เพิ่ม n รูปร่างพิเศษแต่ละครั้งด้วยการค้นหาที่ลดลง (ส่วนใหญ่ดีสำหรับ beziers) |
nth | 1 | บันทึกทุกเฟรม n (เฉพาะเมื่อ %d อยู่ในเส้นทางเอาต์พุต) |
r | 256 | ปรับขนาดภาพอินพุตขนาดใหญ่ให้เป็นขนาดนี้ก่อนการประมวลผล |
s | 1024 | ขนาดภาพเอาท์พุท |
a | 128 | Color Alpha (ใช้ 0 เพื่อให้อัลกอริทึมเลือกอัลฟ่าสำหรับแต่ละรูปร่าง) |
bg | AVG | เริ่มต้นสีพื้นหลัง (hex) |
j | 0 | จำนวนคนงานขนาน (ค่าเริ่มต้นใช้คอร์ทั้งหมด) |
v | ปิด | เอาต์พุต verbose |
vv | ปิด | เอาต์พุตที่มีคำกริยามาก |
ขึ้นอยู่กับส่วนขยายชื่อไฟล์เอาต์พุตที่มีให้คุณสามารถผลิตเอาต์พุตประเภทต่าง ๆ
PNG
: เอาต์พุตแรสเตอร์JPG
: เอาต์พุตแรสเตอร์SVG
: เอาต์พุตเวกเตอร์GIF
: เอาท์พุทภาพเคลื่อนไหวแสดงรูปร่างที่เพิ่มขึ้น - ต้องการ imageMagick (โดยเฉพาะคำสั่ง convert
) สำหรับเอาต์พุต 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 - การเขียนโปรแกรมทางพันธุกรรม: วิวัฒนาการของ Mona Lisa เนื่องจากเห็นบทความนั้นเมื่อมันค่อนข้างใหม่ฉันได้แก้ไขปัญหานี้ที่นี่และในช่วงหลายปีที่ผ่านมา แต่ตอนนี้ฉันพอใจกับผลลัพธ์ของฉันเท่านั้น
ควรสังเกตว่ามีความแตกต่างอย่างมีนัยสำคัญในการดำเนินการของฉันเมื่อเทียบกับงานต้นฉบับของโรเจอร์ เหมืองไม่ใช่อัลกอริทึมทางพันธุกรรม ฉันทำงานเพียงครั้งละหนึ่งรูป ของฉันเร็วกว่ามาก (AFAIK) และรองรับรูปร่างหลายประเภท
นี่คือตัวอย่างเพิ่มเติมจากภาพถ่ายที่น่าสนใจที่พบใน Flickr