• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Focations

Projecto

13 mensagens neste tópico

Boas

Sou novo por estas andanças e pela programação em Python também.

Comecei a programar (pouco) em Python devido à cadeira de Computadores & Programação que tenho na faculdade, esta muito mal leccionada diga-se.

Para terminar a cadeira temos um projecto final no qual é pedido o seguinte:

Implemente uma classe imagem a preto e branco (BlackWhite) que permita guardar imagens de tamanho arbitrário e que implemente as operações: negativo (transforma branco em preto e vice-versa), suavizar, leitura e escrita a partir de um ficheiro.

Obs:

Suavizar em que cada ponto (pixel) é substituído de acordo com a regra:

faça uma média dos pontos vizinhos não diagonais; se a soma for igual ou superior a 3 escreva 1, caso

contrário escreva 0. Para os pontos na fronteira da imagem considere que os pixels exteriores são brancos;

Acontece que tou com alguma dificuldade em implementar o suavizar.

A seguir segue o código que já está feito (com uns pequenos comentários meus e algumas duvidas)

class imagem:

    def __init__(self, matriz):
        self.m = matriz

    def negativo(self):
        nova_matriz = []
        for i in self.m:
            nova_linha = []
            for j in i:
                if j==0:
                    nova_linha.append(1)
                else:
                    nova_linha.append(0)
            nova_matriz.append (nova_linha)
        return Imagem (nova_matriz)

    def suavizar(self):
        # não consigo...

    def escrever(self):
        for i in self.m:
            print i

ficheiro = raw_input("Nome do ficheiro: ")

f = open(ficheiro,"r")
a=f.read()
f.close()

n_linhas = 8 # Gostaria que este comando fosse definido consoante o ficheiro que for introduzido pelo utilizador.
n_colunas = 8 # E este a mesma coisa

b2=[]
for i in range(n_linhas):
    blinha=[]
    for j in range(n_colunas):
        blinha.append(int(a[i*(n_linhas+1)+j]))
    b2.append(blinha)
    
print ""
print "Matriz original"
b = imagem (b2)
b.escrever()

print ""
print "Matriz negativa"
c = b.negativo()
c.escrever()

Obrigado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de tudo, queria pedir-te para em vez de fazeres quote do código, que o metas com o GeShi. Podes ver aqui como.

Em relação ao suavizar, ficaria assim:

def suavizar(self,pixel):
media=self.m[pixel+1]+self.m[pixel-1]+self.m[pixel-largura_da_imagem]+self.m[pixel+largura_da_imagem]
# Os quatro pixels vizinhos (cima,baixo,esquerda,direita)
if media>=3: return 1 # Caso Maior ou Igual a 3, escrever 1
else: return 0 # Caso menor (resto=else), escrever 0

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Percebi inteiramente o código que foi escrito e muito obrigado, mas uma pergunta de quem é completamente ignorante e só trabalha nisto à muito poucos meses:

Este tipo de definição adapta-se ao programa que tou a desenvolver? É que não defini pixel nem largura_da_imagem. Como as defino? Tem a ver com a imagem que for adicionada ao programa pelo utilizador?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este tipo de definição adapta-se ao programa que tou a desenvolver? É que não defini pixel nem largura_da_imagem. Como as defino? Tem a ver com a imagem que for adicionada ao programa pelo utilizador?

Ou passas essa informação como argumento, ou defines como uma variável do objecto (self.dimensoes = [horizontal, vertical] por exemplo) (a minha recomendada).
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá djthyrax

Desculpa o incómodo, mas continuo com diversas dúvidas quanto ao que me sugeriste para o meu Projecto.

Como à pouco tempo é que entrei neste mundo existem alguns conselhos e sugestões que me passam um pouco ao lado.

Poderias materializar esse conselho em código?

Obrigado

Focations

Pegando no código do post inicial:

class imagem:

    def __init__(self, matriz, tamanhoHorizontal, tamanhoVertical):
        self.m = matriz
        self.dimensoes = [tamanhoHorizontal, tamanhoVertical] #self.dimensoes[0] é o tamanho horizontal, self.dimensoes[1] é o tamanho vertical (altura)

    def negativo(self):
        nova_matriz = []
        for i in self.m:
            nova_linha = []
            for j in i:
                if j==0:
                    nova_linha.append(1)
                else:
                    nova_linha.append(0)
            nova_matriz.append (nova_linha)
        return Imagem (nova_matriz)

    def suavizar(self,pixel):
        media=self.m[pixel+1]+self.m[pixel-1]+self.m[pixel-self.dimensoes[1]]+self.m[pixel+self.dimensoes[0]]
        # Os quatro pixels vizinhos (cima,baixo,esquerda,direita)
        if media>=3: return 1 # Caso Maior ou Igual a 3, escrever 1
        else: return 0 # Caso menor (resto=else), escrever 0

    def escrever(self):
        for i in self.m:
            print i

ficheiro = raw_input("Nome do ficheiro: ")

f = open(ficheiro,"r")
a=f.read()
f.close()

n_linhas = 8 # Gostaria que este comando fosse definido consoante o ficheiro que for introduzido pelo utilizador.
n_colunas = 8 # E este a mesma coisa

b2=[]
for i in range(n_linhas):
    blinha=[]
    for j in range(n_colunas):
        blinha.append(int(a[i*(n_linhas+1)+j]))
    b2.append(blinha)
    
print ""
print "Matriz original"
b = imagem (b2, n_linhas, n_colunas)
b.escrever()

print ""
print "Matriz negativa"
c = b.negativo()
c.escrever()

Se não me enganei, é assim. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em relação ao suavizar, ficaria assim:

def suavizar(self,pixel):
media=self.m[pixel+1]+self.m[pixel-1]+self.m[pixel-largura_da_imagem]+self.m[pixel+largura_da_imagem]
# Os quatro pixels vizinhos (cima,baixo,esquerda,direita)
if media>=3: return 1 # Caso Maior ou Igual a 3, escrever 1
else: return 0 # Caso menor (resto=else), escrever 0

Peço desculpa, mas esqueci-me de fazer a media. Quer dizer, falta dividir a soma por quatro, ficando assim:

def suavizar(self,pixel):
media=self.m[pixel+1]+self.m[pixel-1]+self.m[pixel-largura_da_imagem]+self.m[pixel+largura_da_imagem]
# Os quatro pixels vizinhos (cima,baixo,esquerda,direita)
media/=4
if media>=3: return 1 # Caso Maior ou Igual a 3, escrever 1
else: return 0 # Caso menor (resto=else), escrever 0

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou a tentar começar a aprender Python e tenho umas dúvidas em relação ao código:

Na função suavizar o que acontece se lhe dermos um pixel que esteja na fronteira? É que não parece haver nada que tenha em conta essa hipótese.

E em relação ao que o Tharis disse, porque é que divides por 4? Se o máximo que podes obter na soma é 4 ao dividir por 4 nunca atinges o valor 3, certo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ele está a calcular a média de self.m[pixel+1]+self.m[pixel-1]+self.m[pixel-largura_da_imagem]+self.m[pixel+largura_da_imagem], daí estar a dividir por 4.

Anyway, em relação à fronteira, é fazer a soma passo a passo e ter um try...except a incrementar uma var i que vai ter o número de pixeis somados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ele está a fazer a média... Mas depois testa se a média é >= 3. Ora inicialmente aquilo que se pretende é que se A SOMA for >=3 fica 1, senão fica 0. A média de valores 0 e 1 nunca pode ser maior que 3, percebes?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ele está a fazer a média... Mas depois testa se a média é >= 3. Ora inicialmente aquilo que se pretende é que se A SOMA for >=3 fica 1, senão fica 0. A média de valores 0 e 1 nunca pode ser maior que 3, percebes?

Tens razão. Ou o problema tá mal explicado, ou a média de que eles falam não tem nada a ver com a matemática... (Se tiveres outra interpretação do que eles querem diz.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu percebo o que eles dizem, está é pouco explícito. Dado que se trata de black&white as quadrículas têm valor 0 ou 1.

Eles querem que a média das cores adjacentes defina a cor final, isto é, se der uma média de 0-0.5 fica 0, se for 0.75 ou 1 fica 1.

A maneira de traduzirem isto é dizerem que se a soma for >=3 então fica 1. 

Não há duvida de que a exposição é um bocado confusa mas enfim...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu percebo o que eles dizem, está é pouco explícito. Dado que se trata de black&white as quadrículas têm valor 0 ou 1.

Eles querem que a média das cores adjacentes defina a cor final, isto é, se der uma média de 0-0.5 fica 0, se for 0.75 ou 1 fica 1.

A maneira de traduzirem isto é dizerem que se a soma for >=3 então fica 1. 

Não há duvida de que a exposição é um bocado confusa mas enfim...

Ah pronto. Mas percebeste o código e é o que interessa. :(

Fizeste bem em escolher Python!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora