def es13(fimm, fimm1):
    x = 50
    img = immagini.load(fimm)
    newImg = img.copy()
    pixelsSet = set()

    for row in range(len(img)):
        for col in range(len(img[0])):
            pixelsSet.add(img[row][col])

    pixelsList = sorted(list(pixelsSet))
    groupedPixels = getGroupDict(pixelsList, x)

    for row in range(len(img)):
        for col in range(len(img[0])):
            oldPix = img[row][col]
            for group in groupedPixels:
                if ((oldPix == group) or (oldPix in groupedPixels[group])):
                    newImg[row][col] = group
                    break

    immagini.save(newImg, fimm1)
    return len(groupedPixels)
def es42(fImageIn, fcolori, fImageOut):
    '''
  Si progetti la funzione es42(fImageIn, fcolori, fImageOut) che
  modifica il colore di alcuni pixel presenti in un imagine  PNG fImageIn  e salva poi l'immagine
  modificata  in un nuovo file PNG FImageOut.
  La funzione inoltre ritorna il numero di pixel dell'immagine i cui colori sono stati modificati.
  I colori da modificare sono specificati dal file di testo fcolori.
  Il file fcolori ha tante righe quanti sono i colori da modificare.
  Ogni riga di fcolori contiene  6 interi a valori tra 0 e 255.
  I primi tre indicano il colore da modificare
  e i secondi tre il nuovo colore
  Ad esempio la presenza eventuale della riga
  0 0 0  255 255 255
  indica che nell'immagine tutti  i pixel di colore nero ( i.e. di colore  (0,0,0)) devono
  assumere colore bianco (i.e. devono assumere colore (255,255,255)).

  NOTA: i colori devono essere sostituiti contemporaneamente
  (e non con una sostituzione alla volta che potrebbe modificare un pixel piu' volte)

  :param fImageIn: nome del file PNG contenente l'immagine da modificare
  :param fcolori: nome del file di testo in cui trovare i colori da modificare
  :param fImageOut: nome del file PNG in cui salvare l'immagine modificata
  :return: numero di pixel modificati
  '''
    switchesDict = getColorSwitches(fcolori)
    img = immagini.load(fImageIn)
    count = 0

    for row in range(len(img)):
        for col in range(len(img[0])):
            oldColor = img[row][col]
            if (oldColor in switchesDict):
                img[row][col] = switchesDict[oldColor]
                count += 1
    immagini.save(img, fImageOut)
    return count
def cammino(fname,  fname1):
    '''inseriti il nome del percorso da caricare e da salvare la funzione ritorna il percorso del robottino colorato all'interno della scacchiera'''
    img = load(fname)
    def drawSquare(tx, ty, c):
        '''disegna un quadrato di colore c nel range richiesto'''
        for y in range(ty*40, ty*40+40):
            for x in range(tx*40, tx*40+40):
                img[y][x] = c
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    robotDir, s, x, y, rotationsDone, count = directions[0], "", 0, 0, 0, 0
    while rotationsDone != 4:
        if isInside(x + robotDir[1], y + robotDir[0]):
            p = img[(y + robotDir[0])*40][(x + robotDir[1])*40]
            if p != (255,0,0) and p != (0,255,0):
                s += str(count % 4)
                drawSquare(x, y, (0,255,0))
                x, y, rotationsDone = x + robotDir[1], y + robotDir[0], 0
                continue
        count += 1
        robotDir = directions[count % 4]
        rotationsDone += 1
    drawSquare(x, y, (0,0,255))
    save(img, fname1)
    return s
def ricolora(fname, lista, fnameout):
    A = immagini.load(fname)
    righe = len(A)
    colonne = len(A[0])

    L = list()  # Lista delle coppie (superfice, perimetro)
    for tp in lista:
        y, x, a, b = tp  # a e' il colore interno, b il colore dei pixel perimetrali
        coloreIniziale = A[x][y]
        daEsaminare = set()
        perimetro = set()
        if e_dentro(x - 1, y, righe,
                    colonne) and A[x - 1][y] == coloreIniziale:
            daEsaminare.add((x - 1, y))
            if e_sulPerimetro(
                    A, x - 1, y, righe,
                    colonne):  # e_sulPerimetro(A, x, y, righe, colonne)
                perimetro.add((x - 1, y))
        if e_dentro(x, y + 1, righe,
                    colonne) and A[x][y + 1] == coloreIniziale:
            daEsaminare.add((x, y + 1))
            if e_sulPerimetro(A, x, y + 1, righe, colonne):
                perimetro.add((x, y + 1))
        if e_dentro(x + 1, y, righe,
                    colonne) and A[x + 1][y] == coloreIniziale:
            daEsaminare.add((x + 1, y))
            if e_sulPerimetro(
                    A, x + 1, y, righe,
                    colonne):  # e_sulPerimetro(A, x, y, righe, colonne)
                perimetro.add((x + 1, y))
        if e_dentro(x, y - 1, righe,
                    colonne) and A[x][y - 1] == coloreIniziale:
            daEsaminare.add((x, y - 1))
            if e_sulPerimetro(
                    A, x, y - 1, righe,
                    colonne):  # e_sulPerimetro(A, x, y, righe, colonne)
                perimetro.add((x, y - 1))

        esaminati = set()
        while len(daEsaminare) > 0:
            (i, j) = daEsaminare.pop()  # pop preleva l'elemento dal set
            if (i, j) not in esaminati:  # and A[i][j] == coloreIniziale:
                esaminati.add((i, j))
                if e_dentro(i - 1, j, righe,
                            colonne) and A[i - 1][j] == coloreIniziale:
                    daEsaminare.add((i - 1, j))
                    if e_sulPerimetro(A, i - 1, j, righe, colonne):
                        perimetro.add((i - 1, j))
                if e_dentro(i, j + 1, righe,
                            colonne) and A[i][j + 1] == coloreIniziale:
                    daEsaminare.add((i, j + 1))
                    if e_sulPerimetro(A, i, j + 1, righe, colonne):
                        perimetro.add((i, j + 1))
                if e_dentro(i + 1, j, righe,
                            colonne) and A[i + 1][j] == coloreIniziale:
                    daEsaminare.add((i + 1, j))
                    if e_sulPerimetro(A, i + 1, j, righe, colonne):
                        perimetro.add((i + 1, j))
                if e_dentro(i, j - 1, righe,
                            colonne) and A[i][j - 1] == coloreIniziale:
                    daEsaminare.add((i, j - 1))
                    if e_sulPerimetro(A, i, j - 1, righe, colonne):
                        perimetro.add((i, j - 1))

        p = s = 0  # p = perimetro (numero di pixel perimetrali), s = superfice (numero di pixel interni)
        for i, j in esaminati:
            if (i, j) in perimetro:
                A[i][j] = b
                p = p + 1
            else:
                A[i][j] = a
                s = s + 1
        L.append((s, p))

    immagini.save(A, fnameout)

    return L
def cammino(fname, fname1):
    '''Implementare qui la funzione'''
    img = load(fname)
    s = robot(img)
    save(img, fname1)
    return s
Example #6
0
def cammino(fname, fname1):

    img = load(fname)
    direzione = ('destra', 'sotto', 'sinistra', 'sopra')
    index = 0
    lista = []
    riga = 0
    colonna = 0
    scontro = 0
    finito = False
    verde = (0, 255, 0)
    blu = (0, 0, 255)
    bianco = (0, 0, 0)
    nero = (255, 255, 255)
    rosso = (255, 0, 0)
    disegna(img, riga, colonna, 40, 40, verde)
    while True:

        finito = cond1(colonna, riga, verde, rosso, blu, img, finito)
        if finito == True:
            break

        if direzione[index] == 'destra':
            newcolonna = colonna + 40

            if newcolonna < 0 or newcolonna >= 600:
                index += 1
                index = aggiusta(direzione, index)
                continue

            if img[riga][newcolonna] == nero or img[riga][newcolonna] == bianco:
                colonna += 40
                disegna(img, riga, colonna, 40, 40, verde)
                lista.append('0')

            elif img[riga][newcolonna] == rosso or img[riga][
                    newcolonna] == verde:
                index += 1
                index = aggiusta(direzione, index)

        elif direzione[index] == 'sotto':
            newriga = riga + 40

            if newriga < 0 or newriga >= 600:
                index += 1
                index = aggiusta(direzione, index)
                continue

            if img[newriga][colonna] == nero or img[newriga][colonna] == bianco:
                riga += 40
                disegna(img, riga, colonna, 40, 40, verde)
                lista.append('1')

            elif img[newriga][colonna] == rosso or img[newriga][
                    colonna] == verde:
                index += 1
                index = aggiusta(direzione, index)

        elif direzione[index] == 'sinistra':
            newcolonna = colonna - 40

            if newcolonna < 0 or newcolonna >= 600:
                index += 1
                index = aggiusta(direzione, index)
                continue

            if img[riga][newcolonna] == nero or img[riga][newcolonna] == bianco:
                colonna -= 40
                disegna(img, riga, colonna, 40, 40, verde)
                lista.append('2')

            elif img[riga][newcolonna] == rosso or img[riga][
                    newcolonna] == verde:
                index += 1
                index = aggiusta(direzione, index)

        elif direzione[index] == 'sopra':
            newriga = riga - 40

            if newriga < 0 or newriga >= 600:
                index += 1
                index = aggiusta(direzione, index)
                continue

            if img[newriga][colonna] == nero or img[newriga][colonna] == bianco:
                riga -= 40
                disegna(img, riga, colonna, 40, 40, verde)
                lista.append('3')

            elif img[newriga][colonna] == rosso or img[newriga][
                    colonna] == verde:
                index += 1
                index = aggiusta(direzione, index)

    save(img, fname1)
    stringa = ''.join(lista)
    return stringa
Example #7
0
def ricolora(fname, lista, fnameout):
    f = immagini.load(fname)
    out = f
    ris = []
    for i in range(0, len(lista)):
        per = 0
        are = 0
        lunghezza = 0
        lunghezza1 = 0
        lunghezza2 = 0
        altezza1 = 0
        altezza2 = 0
        altezza = 0
        tupla = lista[i]
        x, y, c1, c2 = tupla
        colore_analiz = out[x][y]

        for colonne in range(x, len(out)):
            if out[y][colonne] == colore_analiz:
                lunghezza1 += 1
            else:
                break

        for colonne in range(x - 1, -1, -1):
            if out[y][colonne] == colore_analiz:
                lunghezza2 += 1
            else:
                break
        lunghezza = lunghezza1 + lunghezza2

        for righe in range(y, len(out[0])):
            if out[righe][x] == colore_analiz:
                altezza1 += 1
            else:
                break
        for righe in range(y - 1, -1, -1):
            if (out[righe][x] == colore_analiz):
                altezza2 += 1
            else:
                break

        altezza = altezza1 + altezza2

        if lunghezza == altezza:
            lato = lunghezza - 1

        verticeX = x - lunghezza2
        verticeY = y - altezza2

        for i in range(verticeX, lato):
            if out[i][verticeY] != c2:
                out[i][verticeY] = c2
                per += 1

        for i in range(verticeX, lato + 1):
            if out[i][verticeY + lato] != c2:
                out[i][verticeY + lato] = c2
                per += 1

        for i in range(verticeY, lato):
            if out[verticeX][i] != c2:
                out[verticeX][i] = c2
                per += 1

        for i in range(verticeY, lato):
            if out[verticeX + lato][i] != c2:
                out[verticeX + lato][i] = c2
                per += 1

        are = draw_rect(out, verticeX + 1, verticeY + 1, lato - 1, lato - 1,
                        c1)
        test1 = out
        immagini.save(test1, 'test1.png')

        ris += [(are, per)]

    return ris
Example #8
0
def cammino(fname, fname1):
    image = immagini.load(fname)
    global log

    def move(y, x):
        global rotationCounter
        global pos
        global d

        if rotationCounter > 4:
            for i in range(y, y + 40):
                for j in range(x, x + 40):
                    image[i][j] = blu
#            print("ABORTING AT",pos)
            return

        def notInside():
            ylen = len(image)
            xlen = len(image[0])
            global pos
            global d
            #            print('localpos',pos)
            #            print('direction',d)

            if d == 0:
                #                print("testing cond 1")
                #                print(image[pos[0]][pos[1]+40])
                if pos[1] + 40 >= xlen:
                    return True
                elif image[pos[0]][pos[1] +
                                   40] == rosso or image[pos[0]][pos[1] +
                                                                 40] == verde:
                    return True

            elif d == 1:
                if pos[0] + 40 >= ylen:
                    return True
                elif image[pos[0] +
                           40][pos[1]] == rosso or image[pos[0] +
                                                         40][pos[1]] == verde:
                    return True
#                print("COND2")
            elif d == 2:
                if pos[1] - 40 < 0:
                    return True
                elif image[pos[0]][pos[1] -
                                   40] == rosso or image[pos[0]][pos[1] -
                                                                 40] == verde:
                    return True
#                print("COND3")
            elif d == 3:
                if pos[0] - 40 < 0:
                    return True
                elif image[pos[0] -
                           40][pos[1]] == rosso or image[pos[0] -
                                                         40][pos[1]] == verde:
                    return True
#                print("COND4")
            else:
                return False

        if notInside():
            #            print("CHANGING ROTATION")
            d += 1
            rotationCounter += 1
            if d > 3:
                d = 0
            move(pos[0], pos[1])

        else:
            for i in range(y, y + 40):
                for j in range(x, x + 40):
                    image[i][j] = verde

            if d == 0:
                pos[1] += 40
#                print("X PLUS 1")
            elif d == 1:
                pos[0] += 40
#                print("Y PLUS 1")
            elif d == 2:
                pos[1] -= 40
#                print("X MIN 1")
            elif d == 3:
                pos[0] -= 40
#                print("Y MIN 1")

#            print("MOVING TOWARDS")
#            print("POSITION "+str(pos))
#            print("DIRECTION "+str(d))

            log.append(d)
            rotationCounter = 0
            move(pos[0], pos[1])


#    print("ACTIVATING MOVE()")

    move(0, 0)
    immagini.save(image, fname1)
    for i in range(len(log)):
        log[i] = str(log[i])
    log = "".join(log)

    return log
Example #9
0
def cammino(fname,  fname1):
    img=load(fname)
    x=0
    y=0
    dev=0
    s=''
    g=0
    colora(x,y,img)
    while g<4:
        if dev==0 and not inside(img,x,y+40):
            dev=1 
            g=g+1
        elif dev==0 and img[x][y+40]==(255,0,0):
            dev=1
            g=g+1
        elif dev==0 and img[x][y+40]==(0,255,0):
            dev=1
            g=g+1
        elif dev==0 and (img[x][y+40]==(255,255,255) or img[x][y+40]==(0,0,0)) :
            y=y+40
            s=s+'0'
            colora(x,y,img)
            g=0

        elif dev==1 and not inside(img,x+40,y):
            dev=2
            g=g+1
        elif dev==1 and img[x+40][y]==(255,0,0):
            dev=2
            g=g+1
        elif dev==1 and img[x+40][y]==(0,255,0):
            dev=2
            g=g+1
        elif dev==1 and (img[x+40][y]==(255,255,255) or img[x+40][y]==(0,0,0)):
            x=x+40
            s=s+'1'
            colora(x,y,img)
            g=0

            
        elif dev==2 and not inside(img,x,y-40):
            dev=3 
            g=g+1
        elif dev==2 and img[x][y-40]==(255,0,0):
            dev=3
            g=g+1
        elif dev==2 and img[x][y-40]==(0,255,0):
            dev=3
            g=g+1
        elif dev==2 and (img[x][y-40]==(255,255,255) or img[x][y-40]==(0,0,0)):
            y=y-40
            s=s+'2'
            colora(x,y,img)
            g=0


        elif dev==3 and not inside(img,x-40,y):
            dev=0
            g=g+1
        elif dev==3 and img[x-40][y]==(255,0,0):
            dev=0
            g=g+1
        elif dev==3 and img[x-40][y]==(0,255,0):
            dev=0
            g=g+1
        elif dev==3 and (img[x-40][y]==(255,255,255) or img[x-40][y]==(0,0,0)):
            x=x-40
            s=s+'3'
            colora(x,y,img)
            g=0

            
    colorab(x,y,img)
    save(img,fname1)

    return s