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
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
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
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
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