criar filtro nas imagens (python)

Discussão em 'Dicas e tutoriais' iniciado por kodo no kami, 23 Maio 2020 às 20:51.

  1. kodo no kami
    Offline

    kodo no kami Membro Conhecido

    Afiliado:
    16 Dezembro 2015
    Mensagens:
    252
    Sexo:
    Masculino
    Avaliações:
    +336 / -0
    Galera os filtros normalmente são utilizado para processar imagens e outros tipos de dados, eles tambem são utilizados na eletronica e na telecomunicação para atenuar certas frequencias, podemos utilizar os filtros em imagens para criar alguns efeitos visuais legais baseados na luminosidade da imagem ou para diminuir alguns ruidos para um pre-processamento naquela imagem entre outras coisas. Então galera, nesse tutorial vamos aprender como criar filtros do tipo passa-baixa, passa-alta, passa-banda e rejeita-banda (vamos utilizar nesse tutorial a linguagem python com o modulo pillow, embora possa ser feito em qualquer outra linguagem de sua preferencia bastando saber como manipular os pixels por ela). Para esse tutorial vou usar uma imagem base da shana do anime shakugan no shana

    [​IMG]

    para começar vamos importar o modulo PIL e depois carregar a imagem com o metodo open (Image.open),

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    vamos pega o tamanho da imagem para correr ela pixel a pixel

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    tam = img.size
    agora criamos uma variavel começando com o valor 0, depois em um loop while incrementamos essa variavel ate um dos tamanhos da imagem

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    tam = img.size

    contx = 0
    while(contx < tam[0]):
       contx += 1
    fazemos outra variavel dentro daquele loop e fazemos outro loop while la dentro tambem, com isso vamos conseguir ler pixel a pixel da imagem

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    tam = img.size

    contx = 0
    while(contx < tam[0]):
       conty = 0
       while(conty < tam[1]):
         conty += 1
       contx += 1
     
    para a gente conseguir pega o pixel da imagem usamos o metodo getpixel e uma tupla com a posição XY

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    tam = img.size

    contx = 0
    while(contx < tam[0]):
       conty = 0
       while(conty < tam[1]):
         r,g,b = img.getpixel((contx, conty))

         conty += 1
       contx += 1
    para fica mais facil manipular os 3 pixels, fazemos uma media dos 3 e atribuimos a uma variavel

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    tam = img.size

    contx = 0
    while(contx < tam[0]):
       conty = 0
       while(conty < tam[1]):
         r,g,b = img.getpixel((contx, conty))
         pixel_media = (r + g + b) // 3
         conty += 1
       contx += 1
     
    agora basta criar a logica para cada filtro, para o filtro passa-baixa a gente vai atenuar apartir de um valor de corte, para fazer isso basta comparar a media com o nosso valor onde vai começar a cortar, se a media for maior que o valor de corte basta a gente começar atenuar os pixels (uma boa seria subtrair ou dividir eles por uma constante)

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    tam = img.size

    contx = 0
    while(contx < tam[0]):
       conty = 0
       while(conty < tam[1]):
         r,g,b = img.getpixel((contx, conty))
         pixel_media = (r + g + b) // 3
         corte = 0x70
         constante = 0x25
         if(pixel_media > corte):
           r -= constante
           g -= constante
           b -= constante

           conty += 1
         contx += 1
     
    para atribuir o pixel a imagem usamos o metodo putpixel, passamos para ele duas tuplas, a primeira é a posição XY e a segunda a tupla de cores RGB

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    tam = img.size

    contx = 0
    while(contx < tam[0]):
       conty = 0
       while(conty < tam[1]):
         r,g,b = img.getpixel((contx, conty))
         pixel_media = (r + g + b) // 3
         corte = 0x70
         constante = 0x25
         if(pixel_media > corte):
           r -= constante
           g -= constante
           b -= constante
         img.putpixel((contx, conty),(r,g,b))
         conty += 1
       contx += 1
     
    usamos o metodo show para exibir a imagem antes e depois do filtro passa-baixa

    Código (Forge Crash):
    #!/usr/bin/python3

    from PIL import Image

    img = Image.open("shana.png")
    tam = img.size

    img.show()

    contx = 0
    while(contx < tam[0]):
       conty = 0
       while(conty < tam[1]):
         r,g,b = img.getpixel((contx, conty))
         pixel_media = (r + g + b) // 3
         corte = 0x70
         constante = 0x25
         if(pixel_media > corte):
           r -= constante
           g -= constante
           b -= constante
         img.putpixel((contx, conty),(r,g,b))
         conty += 1
       contx += 1

    img.show()
     
    [​IMG]

    para os fitros passa-alta a logica é mesma bastando trocar a condição para quando o valor for menor do que o valor de corte

    Código (Forge Crash):
       corte = 0x70
       constante = 0x25
       if(pixel_media < corte):
         r -= constante
         g -= constante
         b -= constante
    [​IMG]

    para os filtros passa-banda vamos ter dois cortes um passa-alta e um passa-baixa

    Código (Forge Crash):
       corteBaixo = 0x70
       corteAlto = 0x90
       constante = 0x25
       if((pixel_media < corteBaixo) or (pixel_media > corteAlto)):
         r -= constante
         g -= constante
         b -= constante
     
    [​IMG]


    nos filtros rejeita-banda bastaria a gente inverte a logica do passa-banda, entretanto o mais fiel a um rejeita-banda seria uma especie de parabola, entao podemos usar o valor de corte subtraido pela constante para ter o ponto central mais atenuado, então os pixels mais proximos ao ponto central vão esta mais atenuado do que os que estão mais longe dele

    Código (Forge Crash):
       corteFoco = 0x70
       constante = 0x25
       if(pixel_media == corteFoco):
         r -= constante
         g -= constante
         b -= constante
       if((pixel_media > (corteFoco - constante)) and (pixel_media < corteFoco)):
         r -= r - (corteFoco - constante)
         g -= g - (corteFoco - constante)
         b -= b - (corteFoco - constante)
       elif((pixel_media < (corteFoco + constante)) and (pixel_media > corteFoco)):
         r -= (corteFoco + constante) - r  
         g -= (corteFoco + constante) - g
         b -= (corteFoco + constante) - b
    [​IMG]

    bom galera esses são os filtros mais simples \o

    by kodo no kami
     

Compartilhe esta Página