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 vamas 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
para começar vamos importar o modulo PIL e depois carregar a imagem com o metodo open (Image.open),
vamos pega o tamanho da imagem para correr ela pixel a pixel
agora criamos uma variavel começando com o valor 0, depois em um loop while incrementamos essa variavel ate um dos tamanhos da imagem
fazemos outra variavel dentro daquele loop e fazemos outro loop while la dentro tambem, com isso vamos conseguir ler pixel a pixel da imagem
para a gente conseguir pega o pixel da imagem usamos o metodo getpixel e uma tupla com a posição XY
para fica mais facil manipular os 3 pixels, fazemos uma media dos 3 e atribuimos a uma variavel
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)
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
usamos o metodo show para exibir a imagem antes e depois do filtro passa-baixa
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
para os filtros passa-banda vamos ter dois cortes um passa-alta e um passa-baixa
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
bom galera esses são os filtros mais simples \o
by kodo no kami
para começar vamos importar o modulo PIL e depois carregar a imagem com o metodo open (Image.open),
- Código:
#!/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:
#!/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:
#!/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:
#!/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:
#!/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:
#!/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:
#!/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:
#!/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:
#!/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()
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:
corte = 0x70
constante = 0x25
if(pixel_media < corte):
r -= constante
g -= constante
b -= constante
para os filtros passa-banda vamos ter dois cortes um passa-alta e um passa-baixa
- Código:
corteBaixo = 0x70
corteAlto = 0x90
constante = 0x25
if((pixel_media < corteBaixo) or (pixel_media > corteAlto)):
r -= constante
g -= constante
b -= constante
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:
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
bom galera esses são os filtros mais simples \o
by kodo no kami