Domanda da interpretare

Algoritmi, discussioni sulle possibili implementazioni, matematica, fisica e tutti gli argomenti correlati alla programmazione
Rispondi
Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Domanda da interpretare

Messaggio da doom13 »

Il vicinato di un pixel p di un'immagine sono i pixel adiacenti a p sia per
lato che per diagonale. Se e' un pixel di bordo il vicinato comprende solamente
i pixel adiacenti contenuti nell'immagine. I pixel del vicinato sono ordinati
in senso orario a partire da quello in alto a sinistra. Qui sotto e' mostrato
un pixel p e i pixel del suo vicinato numerati secondo l'ordine suddetto:

1 | 2 | 3
---|---|---
8 | p | 4
---|---|---
7 | 6 | 5

Per distanza di due colori intendiamo la somma delle differenze assolute delle
tre componenti colore (RGB). Chiamiamo edging la seguente trasformazione di
un'immagine: Il colore di ogni pixel p diventa uguale al colore piu' distante
dal colore di p nel vicinato di p. Se ci sono piu' colori alla massima distanza
si sceglie il primo nell'ordine del vicinato.

Scrivere una funzione edging(fname_in, k, fname_out) che presa in input
un'immagine in formato PNG nel file fname_in e un intero k >= 1, applica k
volte la trasformazione di edging all'immagine e salva l'immagine ottenuta nel
file fname_out. Applicare la trasformazione k volte significa che la prima
volta la trasformazione e' applicata all'immagine di input, la seconda volta e'
applicata all'immagine ottenuta dalla prima applicazione, la terza volta e'
applicata all'immagine ottenuta dalla seconda applicazione, e cosi' via.


Bum questo mi chiede ma oggi sto rimbecillito e non riesco a capire quello che devo fare.
Se può interessarvi lo devo in Python ma poco cambia, mi dovete assolutamente aiutare a capire il problema.

PS
Non sapevo dove postarlo e questa mi sembrava la sezione più giusta, forse andava bene anche in discussioni serie o ogni sorta de male boh, in tal caso spostate il topic :sisisi:
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: Domanda da interpretare

Messaggio da Cash »

doom13 ha scritto:Il vicinato di un pixel p di un'immagine sono i pixel adiacenti a p sia per
lato che per diagonale. Se e' un pixel di bordo il vicinato comprende solamente
i pixel adiacenti contenuti nell'immagine. I pixel del vicinato sono ordinati
in senso orario a partire da quello in alto a sinistra. Qui sotto e' mostrato
un pixel p e i pixel del suo vicinato numerati secondo l'ordine suddetto:

1 | 2 | 3
---|---|---
8 | p | 4
---|---|---
7 | 6 | 5

Per distanza di due colori intendiamo la somma delle differenze assolute delle
tre componenti colore (RGB). Chiamiamo edging la seguente trasformazione di
un'immagine: Il colore di ogni pixel p diventa uguale al colore piu' distante
dal colore di p nel vicinato di p. Se ci sono piu' colori alla massima distanza
si sceglie il primo nell'ordine del vicinato.

Scrivere una funzione edging(fname_in, k, fname_out) che presa in input
un'immagine in formato PNG nel file fname_in e un intero k >= 1, applica k
volte la trasformazione di edging all'immagine e salva l'immagine ottenuta nel
file fname_out. Applicare la trasformazione k volte significa che la prima
volta la trasformazione e' applicata all'immagine di input, la seconda volta e'
applicata all'immagine ottenuta dalla prima applicazione, la terza volta e'
applicata all'immagine ottenuta dalla seconda applicazione, e cosi' via.


Bum questo mi chiede ma oggi sto rimbecillito e non riesco a capire quello che devo fare.
Se può interessarvi lo devo in Python ma poco cambia, mi dovete assolutamente aiutare a capire il problema.

PS
Non sapevo dove postarlo e questa mi sembrava la sezione più giusta, forse andava bene anche in discussioni serie o ogni sorta de male boh, in tal caso spostate il topic :sisisi:
Provo ad interpretarlo ma non ne sono sicuro neanche io:
Ad ogni pixel adiacente al pixel iniziale devi dargli un valore detto distanza,questo valore si ottiene sommando le differenze tra i valori RGB di ogni pixel, ergo se un pixel ha come valori RGB 20,10,5 farai |(20-10)|+|(10-5)|+|(20-5)| (nota:prendi i valori assoluti,togli i segni se ci sono),dopo che hai trovato il valore distanza di ogni pixel adiacente guardi quale è il maggiore e il colore del pixel a cui il valore corrisponde, il pixel di cui devi modificare il colore avrà lo stesso colore del pixel con il valore distanza maggiore. Spero di aver capito bene anche perchè se si cerca edging su Google si trovano solo articoli sugli orgasmi

Avatar utente
Delfador
Membro attivo
Messaggi: 376
Iscritto il: 04/01/2010, 19:52
Specialità: Ehm...
Località: <- Per di qua ->
Contatta:

Re: Domanda da interpretare

Messaggio da Delfador »

Suppongo che sul concetto di vicinato non ci siano dubbi. Passiamo dunque al resto.
Possiamo identificare un colore X mediante la terna (r,g,b). Dati due colori X=(r1,g1,b1) e Y=(r2,g2,b2), diciamo che la loro distanza dist(X,Y)=|r1-r2|+|g1-g2|+|b1-b2|.
La trasformazione di edging fa la seguente cosa per ogni pixel p: sia X il colore di p, e sia Y il colore nel vicinato di p tale che dist(X,Y) è massimo. Allora il pixel p diventa del colore Y.
Tu devi implementare una funzione che esegue la trasformazione di edging k volte.
Immagine

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Domanda da interpretare

Messaggio da doom13 »

Si perfetto, allora ci ero arrivato. Grazie per l'aiuto anche a cash :cappa:
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Domanda da interpretare

Messaggio da doom13 »

Allora, il problema ora è chiaro e dopo aver scritto un po' di righe, sono molto vicino alla soluzione infatti l'immagine che ottengo è quasi identica a quella da confrontare. Quasi perché a quanto pare ci sono pochi pixel di colore diverso che mi fanno saltare il confronto. Detto questo voi come fareste una funzione che mi restituisca il colore del pixel più lontano (ovviamente come spiegato nel topic di apertura) ?
Come ho detto io un codicr l'ho già scritto però ancora non ve lo vorrei postare per non influenzarvi. Oppure se volete lo posto e mi aiutate a sistemarlo.

PS
Non pretendo la funzione in python ma un qualcosa da cui iniziare perché io le idee le ho finite. Uno pseudocodice sarebbe il massimo.

Grazie in ogni caso

Edit:
Vabbè vi metto quello che ho fatto io:

Codice: Seleziona tutto

import image as im

#funzione che mi restituisce il colore del pixel più lontano
def lontano(theimg, j, i):
    lst_color = [] #inizializzo una lista vuota che conterrà i colori dei pixel nel vicinato
    lon_col = () #inizializzo una tupla (lista immutabile) che conterrà il colore da restituire (nel formato rgb)
    dist_num = 0 #distanza del pixel più lontano
    dist_num_mom = 0 #distanza del pixel, utilizzato momentaneamente per i calcoli
    w1 = len(theimg[0])-1 #larghezza dell'immagine
    h1 = len(theimg)-1 #altezza dell'immagine
        
    #verifico che esistano i pixel adiacenti
    #li prendo nell'ordine inverso poichè in caso di pixel alla stessa distanza verrà sovrascritto il colore del pixel precedente nell'ordine descritto nel testo dell'esercizio
    #se il pixel esiste aggiungo il suo colore nella lista citata prima ovvero lst_color
    if j > 0:
        lst_color += [ theimg[j -1][i] ] #pixel a sinistra
    if i < w1 and j > 0:
        lst_color += [ theimg[j -1][i +1] ] #pixel in basso a sinistra
    if i < w1:
        lst_color += [ theimg[j][i +1] ] #pixel in basso
    if i < w1 and j < h1:
        lst_color += [ theimg[j +1][i +1] ] #pixel in basso a destra
    if j < h1:
        lst_color += [ theimg[j +1][i]] #pixel a destra
    if i > 0 and j < h1:
        lst_color += [ theimg[j +1][i -1] ] #pixel in alto a destra
    if i > 0:
        lst_color += [ theimg[j][i -1] ] #pixel in alto
    if i > 0 and j > 0:
        lst_color += [ theimg[j -1][i -1] ] #pixel in alto a sinistra
    
    #per ogni elemento della lista (quella con i colori dei pixel vicini)
    for colore in lst_color:
        r1, g1, b1 = theimg[j][i] #salvo in tre variabili diverse il colore del pixel centrale
        r2, g2, b2 = colore #salvo in altre tre variabili il colore del pixel salvati precedentemente
        dist_num_mom = abs(r1-r2) + abs(g1-g2) + abs(b1-b2) #mi calcolo la distanza dei colori tra quei pixel
        if dist_num_mom >= dist_num: #se la distanza calcolata al momento è maggiore di quella precedente
            dist_num = dist_num_mom #sovrascrivo la distanza maggiore
            lon_col = (r2, g2, b2) #mi salvo il nuovo colore
        #raw_input("Press enter to continue")
    return lon_col #restituisco il colore (quello più lontano quindi)

#questa è la funzione principale ma non credo vi serva
def edging(fname_in, k, fname_out):
    '''Implementare qui la funzione'''
    img = im.load(fname_in) #img = im.load(fname_in)
    
    for _ in range(k):
        new_img = []
        w = len(img[0])
        h = len(img)
        
        for j in range(h):
            row = []
            for i in range(w):
                new_col = lontano(img, j, i)
                row.append(new_col)
            new_img.append(row)
        img = new_img
    im.save(fname_out, img)
    return 1
In sostanza devo modificare "def lontano" perchè il problema dovrebbe essere lì al 99% e in particolare il problema ci dovrebbe essere quando ci sono due colori alla stessa distanza..

PS
Più tardi lo commento

PPS
Ok l'ho commentato, non so proprio che altro modificare, il programma è giusto mannaggia....
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: Domanda da interpretare

Messaggio da doom13 »

OOOOOOOOOOOOOOOOOOOOOOOOOOOOO alleluja, dopo 4 giorni di bestemmie ce l'ho fatta, c'erano gli indici invertiti dio santo, ve lo posto anche se difficilmente interesserà a qualcuno:

Codice: Seleziona tutto

import image as im

def inside(img, i, j):
    '''Ritorna True se il pixel (i, j) e' dentro l'immagine img, False
    altrimenti'''
    iw, ih = len(img[0]), len(img)
    return 0 <= i < iw and 0 <= j < ih
    
def lontano(theimg, j, i):
    lst_color = []
    lon_col = theimg[j][i]
    dist_num = 0
    dist_num_mom = 0
        
    #in ordine prova
    if inside(theimg,i -1,j -1):
        lst_color += [ theimg[j -1][i -1] ] #pixel in alto a sinistra  
    if inside(theimg,i,j -1): 
        lst_color += [ theimg[j -1][i] ] #pixel in alto    
    if inside(theimg,i +1,j -1):
        lst_color += [ theimg[j -1][i +1] ] #pixel in alto a destra
    if inside(theimg,i +1,j):
        lst_color += [ theimg[j][i +1]] #pixel a destra
    if inside(theimg,i +1,j +1):
        lst_color += [ theimg[j +1][i +1] ] #pixel in basso a destra    
    if inside(theimg,i,j +1):
        lst_color += [ theimg[j +1][i] ] #pixel in basso
    if inside(theimg,i -1,j +1):
        lst_color += [ theimg[j +1][i -1] ] #pixel in basso a sinistra                    
    if inside(theimg,i -1,j):
        lst_color += [ theimg[j][i -1] ] #pixel a sinistra
        
    for colore in lst_color:
        r1, g1, b1 = theimg[j][i]
        r2, g2, b2 = colore
        dist_num_mom = abs(r1-r2) + abs(g1-g2) + abs(b1-b2)
        if dist_num_mom > dist_num:
            dist_num = dist_num_mom
            lon_col = (r2, g2, b2)
    return lon_col

def edging(fname_in, k, fname_out):
    '''Implementare qui la funzione'''
    img = im.load(fname_in) #img = im.load(fname_in) #'C:\Users\useric04\Desktop\homeworks\homework03.out\homework03\img03_01_in.png'
    
    for _ in range(k):
        new_img = []
        w = len(img[0])
        h = len(img)
        
        for j in range(h):
            row = []
            for i in range(w):
                new_col = lontano(img, j, i)
                row.append(new_col)
            new_img.append(row)
        img = new_img
    im.save(fname_out, img)
    return 1
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti