All pastes #1880591 Raw Edit

mona-triangle.py

public python v1 · immutable
#1880591 ·published 2010-06-10 18:53 UTC
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()