rendered paste body# -*- coding: utf-8 -*-"""The user interface for our app"""import os,sys, random,popen2import numpyfrom PIL import Image_r = random.randintw=620h=456NUM_T=1000NUM_M=100T_W=100# Import Qt modulesfrom PyQt4 import QtCore, QtGui, uic, QtOpenGL#from compimg import compare_imagesclass Point(object): def __init__(self,x=0,y=0): self.x=x self.y=yclass Triangle(object): def __init__(self): x1 = _r(-T_W/2,w+T_W/2) y1 = _r(-T_W/2,h+T_W/2) self.points=[Point(x1,y1), Point(x1+_r(0,T_W),y1+_r(0,T_W)), Point(x1+_r(0,T_W),y1+_r(0,T_W)), ] self.color=[127,127] #self.color=[0,0] self.rotation=0 self.scale=1.0 def copy(self): c=Triangle() c.scale=self.scale c.color=self.color[:] c.rotation=self.rotation c.points=[Point(p.x,p.y) for p in self.points] return c def mutate(self): # Choose what way to mutate mutated=self.copy() mutation = _r(1,50) if mutation<10: # Change size mutated.scale +=_r(-3,3)/100. elif 20 > mutation: # rotate a bit mutated.rotation+=_r(-5,5) elif 30 > mutation: # lighter/darker mutated.color[0] = min(255,max(0, self.color[0] + _r(-10,10))) elif 40 > mutation: # more transparent mutated.color[1] = min(255,max(0, self.color[1] + _r(-10,10))) else: # move a bit for i,p in enumerate(self.points): mutated.points[i]=Point(p.x+_r(-10,10), p.y+_r(-10,10)) return mutated def polygon(self): poly = QtGui.QPolygonF(0) for p in self.points: poly.insert(0,QtCore.QPointF(p.x,p.y)) #poly.insert(0,QtCore.QPointF(self.points[0].x,self.points[0].y)) return poly# Create a class for our main windowclass Main(QtGui.QDialog): def __init__(self, image): QtGui.QDialog.__init__(self) #uifile = os.path.join( #os.path.abspath( #os.path.dirname(__file__)),'main.ui') uifile = 'main.ui' uic.loadUi(uifile, self) self.pic = QtGui.QPixmap(sys.argv[1]) self.img = self.pic.toImage() self.picture.setPixmap(self.pic) self.picture.setFixedSize(self.pic.size()) self.view.setFixedSize(self.pic.size()) # Create polygons self.polys = [Triangle() for t in range(NUM_T)] self.generation = 0 self.curdiff=1000000000000 def drawScene(self): self.generation +=1 print 'GEN:', self.generation # Create scene, assign to view self.scene = QtGui.QGraphicsScene(QtCore.QRectF(0,0, self.pic.width(), self.pic.height())) self.scene.changed.connect(self.decide) self.view.setScene(self.scene) self.mutated = [p.copy() for p in self.polys] for x in range(NUM_M): i=_r(0,len(self.mutated)-1) self.mutated[i]=self.mutated[i].mutate() for p in self.mutated: shape = self.scene.addPolygon(p.polygon()) shape.setBrush(QtGui.QColor(p.color[0],p.color[0],p.color[0],p.color[1])) shape.setPen(QtGui.QColor(p.color[0],p.color[0],p.color[0],p.color[1])) shape.setScale(p.scale) shape.setTransformOriginPoint(QtCore.QPointF( sum([po.x for po in p.points])/3., sum([po.y for po in p.points])/3., )) shape.setRotation(p.rotation) self.scene.update(self.scene.sceneRect()) self.scene.invalidate(self.scene.sceneRect()) def decide(self): self.new = QtGui.QImage(self.pic.width(), self.pic.height(), QtGui.QImage.Format_RGB32) self.new.fill(QtGui.QColor(255,255,255).rgb()) painter = QtGui.QPainter(self.new) self.scene.render(painter) painter.end() if self.generation % 100 == 10: self.new.save('%s.png'%self.generation) #self.new.save('%s.png'%self.generation) diff = compare_images(self.img, self.new) if diff <= self.curdiff: # better print "** Better: %s - %s"%(diff, self.curdiff-diff) self.polys = self.mutated self.curdiff=diff else: # worse print "Worse: %s - %s"%(diff, self.curdiff-diff), #os.unlink ('%s.png'%self.generation) QtCore.QTimer.singleShot(100, self.drawScene)import cStringIOdef compare_images_pil(img1, img2): # Convert images to PIL buffer1 = QtCore.QBuffer() buffer1.open(QtCore.QIODevice.ReadWrite) img1.save(buffer1, "PNG") strio1 = cStringIO.StringIO() strio1.write(buffer1.data()) buffer1.close() strio1.seek(0) img1 = Image.open(strio1) buffer2 = QtCore.QBuffer() buffer2.open(QtCore.QIODevice.ReadWrite) img2.save(buffer2, "PNG") strio2 = cStringIO.StringIO() strio2.write(buffer2.data()) buffer2.close() strio2.seek(0) img2 = Image.open(strio2) # Compare m1 = numpy.array([p[0] for p in img1.getdata()])#.reshape(*img1.size) m2 = numpy.array([p[0] for p in img2.getdata()])#.reshape(*img2.size) s = numpy.sum(numpy.abs(m1-m2)) return scompare_images = compare_images_pildef compare_images_magick(img1, img2): img1.save('_1.png') img2.save('_2.png') v = os.popen3('compare _1.png _2.png -metric MAE -dissimilarity-threshold 1 diff.png', 'r')[2].read() return float(v.split(' ')[0])def main(): import psyco psyco.full() app = QtGui.QApplication(sys.argv) window=Main(sys.argv[1]) window.show() window.drawScene() sys.exit(app.exec_())if __name__ == "__main__": main()