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

Anaragao

Python vs Matlab em processamento de imagem

10 mensagens neste tópico

Olá a todos,

Sou novata quer em Python quer em programação, no entanto vi-me obrigada a "desenrascar" a propósito da tese de mestrado. O meu problema prende-se com processamento de imagem. A partir de uma fotografia digital tirada num ponto elevado (ex: topo de prédio) traçar uma separação entre o céu e o perfil do ambiente construído (edificios, arvores). O objectivo final é obter no final apenas duas cores, branco e preto, o céu com pixels a branco e o ambiente construído em pixels pretos. Tenho um código em Matlab semelhante ao que pretendo no entanto não sei se é possivel adaptar para Python.

ima = imread('uma.jpg');
bw  = rgb2gray(ima);
aa  = bw >(.8*mean2(bw(1:100, ));
%
% Céu versus Terra:
bwlaa = bwlabel(aa);
ceu   = getOnlyObject(bwlaa, 1, size(aa));
%
% Redução de pormenores nos contornos:
ceu   = imdilate(ceu, strel('disk', 2));
ceu   = imfill(ceu, 'holes');

Dava-me muito jeito poder adaptar a Python para poder depois seguir para o ArcGIS, já que o mm suporta scripts de Python. Será que alguem me pode ajudar?

Mto obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Possível de fazer isso em python é, com toda a certeza.

Uma adaptação desse código pra python é que é capaz de ser uma forma demasiado eufemística de encarar o desafio, talvez 'reescrita' ou 'port' sejam termos mais apropriados.

Esse código usa funções específicas do matlab que por sua vez usam características bastante específicas do matlab. Na verdade, esse código é um óptimo exemplo em como matlab é uma ferramenta que torna pequenas tarefas mais ou menos complexas em problemas incrivelmente simples.

As funções que chamas no teu código só existem no matlab. A solução mais simples será encontrares funções que façam a mesma coisa em python e seguires o mesmo algoritmo. Claro que isto NÃO implica procurares traduzir o código linha a linha, isso é quase de certeza impossível.

Pesquisei no google "python image library" e devolveu-me isto:

http://www.pythonware.com/products/pil/

Parece-me estar bem documentada, mas não encontrei lá muita coisa sobre o uso de filtros que é claramente o que precisas.

Processamento de imagem requere calculo matricial que em python, ao contrário do matlab, não é suportado out-of-the-box. Provavelmente, o que quer que seja que não recorra ao numpy/scipy terá funcionalidades limitadas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá a todos,

Devo confessar que n está fácil obter o resultado final que pretendo.

Ando às voltas com o PIL e o NumPy mas para quem não tem bases de programação nem de processamento de imagens, acrescido de um prazo apertado, o estado no momento é mesmo de partir a cabeça  :wallbash:

Neste momento o que tenho é:

import os, Image, ImageFilter

inputFolder = "C:\\Metodologia\inputFolder"

outputFolder = "C:\\Metodologia\outFolder"

inputImages = os.listdir(inputFolder)

for file in inputImages:

    eachImage = inputFolder + "\\" + file

    im = Image.open(eachImage).convert("L")

    print im.format, im.size, im.mode

    fil = im.filter(ImageFilter.FIND_EDGES)

   

eachImage = outputFolder + "\\" + file

fil.save(eachImage)

A partir daqui tenho uma image com um background = preto e edges = branco.

Gostava de poder transformar a imagem de modo a que a partir do primeiro pixel branco todos os restantes pixels abaixo passassem a branco com o intuito final de ter o céu em preto e todos os relevos em branco. Algumas dicas?

Obrigada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Imagem inicial:

inicialp.jpg

Imagem após filtro:

edges.jpg

O que eu pretendia era depois scanar a imagem por forma a que a mesma fosse lida por colunas até ao primeiro pixel branco, e a partir desse ponto tudo abaixo na coluna passava a branco. Dúvidas concretas....não sei se é melhor passar a imagem para array (numpy) ou se simplesmente com um loop consigo que faça o que pretendo.

Por hora ando em torno do loop seguinte:

for file in inputImages:

    eachImage = inputFolder + "\\" + file

    im = Image.open(eachImage)

    pixels = im.load()

    width, height = im.size

    for x in range(width):

        for y in range(height):

            if pixels[x,y] != (255, 255, 255):

                continue

            else:

                pixels[x,y] == (0, 0, 0)

mas não sei se estou bem encaminhada por aqui.

Deve ser bastante acessível mas sinceramente num espaço de 1 mês ainda n tenho as bases suficientes de programação para ter o raciocinio lógico necessário. Mas hei-de ter..... ;) (daqui a um tempo).

obrigada  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para processamento de imagem, existem técnicas comuns e independentes da linguagem.

Sugiro q antes de começares a escrever código, leias primeiro uns livros sobre processamento de imagem.

Devem existir imensos em formato electronico q podes procurar nos lugares habituais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que tu queres fazer é percorrer a imagem na vertical e após veres o 1o pixel branco, os outros todos ficam a branco. Ou seja, algo como isto:

for x in xrange(largura):
    fill = False
    for y in xrange(altura):
        if fill:
            pixels[x][y] = (255, 255, 255)
            continue
        if pixels[x][y] == (255, 255, 255):
            fill = True

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É qualquer coisa assim sim.

Mas está com um aspeto um pouco esquisito. Isso corre? Quando tiveres dúvidas do que está acontecer envia uma variável para o output com a função print().

Esta comparação está a ter o resultado que estás à espera?

if pixels[x,y] != (255, 255, 255):

Parece-me assim um pouco martelada, comprar um array inteiro não sei que implicações tem. Mas se funcionar bem não compliques.

Agora a última linha é que está mal. Estás a usar o operador de comparação == quando acho que queres utilizar o operador de atribuição =, pelo menos é o que me parece que queres fazer.

Já estás perto. O algoritmo, em português, pode ser qualquer coisa do tipo:

coluna a coluna, vais descendo por aí como estás a fazer e:

É preto? muda a branco.

É branco? segue para a coluna segunte (continue)

Faz uma imagem pequena, por exemplo 10x10, tipo no paint e utiliza-a para os teus testes. Depois quando estiver a funcionar testa na tua imagem. Assim é mais facil visualizar as variáveis e afins.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá, li mal o post, eu fiz para o ceu ficar a preto e o resto a branco lol. Sendo assim, o exemplo passa a ser:

for x in xrange(largura):
    black = False
    for y in xrange(altura):
        if pixels[x][y] == (255, 255, 255):
            black = True
        if black:
            pixels[x][y] = (0, 0, 0)
        else:
            pixels[x][y] = (255, 255, 255)

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