Tenho cerca de 1.400 jpegs que foram corrompidos de alguma forma e perderam as imagens de backup. Todos eles parecem ter o mesmo padrão de linhas em grade sobre cada um (ou seja, a grade não muda de imagem para imagem.
Aqui está a aparência de uma dessas imagens:
Existem técnicas de filtragem de imagem no Matlab, particularmente ou não, que removerão ou suavizarão esse padrão de grade?
Respostas:
Você pode usar um algoritmo de pintura padrão. Esses algoritmos substituem os pixels marcados em uma imagem pelos valores de pixel que cercam esses pixels marcados. O desafio aqui é detectar a grade (meus testes parecem mostrar que não é uma grade completamente regular). Então, eu vim com esta solução:
A saída do programa é a seguinte:
Para detectar a grade, fiz uma solução rápida e suja. Pode ser melhorado bastante, mas mostra a ideia inicial. O fluxo geral é:
Para a pintura, usei a operação de pintura OpenCV . Para detectar a grade, realizei a detecção de arestas nas direções X e Y usando um filtro Sobel. Em seguida, adiciono todos os valores das arestas nas direções X e Y para encontrar picos, onde estão as linhas de grade. Depois, escolho os picos mais altos como as coordenadas nas quais as linhas da grade são estimadas. Não está funcionando perfeitamente (por exemplo, bordas fortes na imagem são falsamente detectadas como linhas de grade), mas mostra a ideia. Pode ser melhorada, por exemplo, na transformação de Hough para encontrar linhas, expulsar arestas muito fortes, etc.
Como alternativa, se a grade é realmente a mesma para todas as imagens, você pode executar a detecção da grade em conjunto para todas as imagens, o que produziria uma precisão muito melhor (basta fazer a técnica acima, mas antes de escolher os picos, resuma os resultados de todas as imagens). Mais detalhadamente, você calcularia o eX para todas as imagens e adicionaria todos esses eX em um único vetor. Esse vetor terá uma estrutura de pico muito mais clara e o limiar pode ser feito mais facilmente.
fonte
Tentei um algoritmo realmente simples de executar um filtro mediano 3x3 nos canais R e G dessa imagem e funciona muito bem. O código python é realmente simples:
Como alternativa, você pode usar a filtragem de domínio de frequência conforme discutido nesta pergunta: /programming/34027840/removing-periodic-noise-from-an-image-using-the-fourier-transform
A transformação de Fourier da sua imagem mostra claramente alguns "pontos" repetidos no espectro correspondentes a esse ruído periódico.
Como Maximilian apontou, este último método funciona bem apenas se o ruído for perfeitamente periódico, o que não parece ser o caso aqui.
Tentei executar um filtro realmente estúpido que zera quadrados de caixas de frequência 5x5 centrados em múltiplos de 9 nas direções x e y e (meio que) suprime o ruído, mas introduz artefatos em locais que não contêm ruído (por exemplo, o céu).
Talvez se possa fazer melhor com o design cuidadoso do filtro de entalhe, em vez de zerar diretamente as caixas de FFT ( nunca faça isso na prática! ) E aplicar o filtro apenas nas regiões da imagem em que o ruído está presente (por exemplo, não filtre o céu).
fonte