Como mencionado nas outras respostas, a difração levou à nitidez. Para colocar isso à prova, pode-se tentar aprimorar a imagem usando a deconvolução usando a função de dispersão pontual que corresponde ao F / 29. Para difração, temos (até uma normalização geral)
P (s) = {J 1 [π rs / ( λF )] / [π rs / ( λF )]} 2
onde J 1 é a função Bessel da primeira espécie de ordem 1 ,
s é a distância na imagem medida em pixels,
r é o tamanho de um pixel (tipicamente cerca de 4,2 * 10 ^ (- 6) metros para sensores de culturas),
λ é o comprimento de onda da luz e
F o número F, neste caso 29.
Isso é verdade para a luz monocromática, para aproximar a função de espalhamento pontual para os canais de cores que podemos calcular em média em uma faixa apropriada de comprimentos de onda. Além disso, deve-se integrar P (s) sobre a área do pixel especificado por s.
Se compilarmos funções de dispersão de 3 pontos para os 3 canais de cores dessa maneira, podemos aguçar a imagem, transformando-a em espaço linear de cores, aplicando um algoritmo de deconvolução e transformando novamente em sRGB. Eu obtive o seguinte resultado:
Portanto, o rosto foi nitidamente aguçado usando apenas os dados sobre o número F e a suposição sobre o tamanho do pixel. Os artefatos de faixas são visíveis na parte escura da imagem, devido à posterização após a transformação novamente em sRGB.
Conforme solicitado, adicionarei mais alguns detalhes sobre os programas usados. Usei o ImageJ e o ImageMagick , também usei o Mathematica para calcular a função de dispersão de pontos, mas isso também pode ser feito no ImageJ. Começarei explicando como deconvolucionarei com o ImageJ quando já tiver a função de spread de ponto. Para fazer a deconvolução, você precisa instalar um plug-in para o ImageJ, usei esse plug-in para este caso, mas também existem outros plugins disponíveis, por exemplo, o plug-in DeconvolutionLab .
Primeiro, você precisa converter em espaço de cores linear, usei o ImageMagick para converter a imagem não-nitida (input.jpg) em espaço de cores linear usando o comando:
convert input.jpg -colorspace RGB output.tif
Em seguida, com o ImageJ, você abre o arquivo output.tif. Em seguida, nas opções do menu, você seleciona "imagem", "cor" e "Spit Channels". Em seguida, no menu, selecione "plugins" e "deconvolução iterativa paralela" e, em seguida, deconvolução interativa 2d ".
Você então obtém a janela de deconvolução, seleciona a imagem e "PSF" significa a função de dispersão de pontos. Lá, você seleciona o arquivo de imagem que contém a função de dispersão de pontos. Para o método, escolhi "WPL", que é baseado no filtro Wiener, que geralmente funciona razoavelmente bem para imagens com baixo ruído. Nas opções para WPL, marque a opção "normalize PSF" e, para o filtro passa-baixo, altere o valor para 0,2; por padrão, é 1, mas um valor mais baixo é melhor para imagens com baixo ruído (se você escolher maior, você ' obterá uma imagem menos nítida). As outras opções, Limite, podem ser escolhidas para serem reflexivas, o redimensionamento pode ser definido para "próxima potência de 2", a saída pode ser definida para 32 bits, a precisão pode ser definida para dobrar. Eu escolhi o número máximo de iterações para 15,
Você executa o programa clicando em "deconvolve". Você então obtém um arquivo de imagem de 32 bits como saída. Geralmente, os valores de pixel são bastante semelhantes aos da imagem original, mas você pode ter alguns pixels que excedem o máximo para o formato da imagem original. Portanto, nesse caso, começamos com imagens de 8 bits, mas na imagem não envolvida, você pode ter valores de cinza que excedem 255, o que faz com que toda a imagem fique muito escura. Isso deve ser corrigido recortando esses pixels para 255, o que você pode fazer selecionando no menu "processo" e depois em "Matemática" e, em seguida, "Máximo". O valor Máximo será usado para cortar os valores em cinza que excederem esse valor. Observe que isso será feito na imagem em que você clicou pela última vez. Você também pode ver qual arquivo é o "arquivo atual" selecionando "
Depois de desconectar os três componentes de cores, você pode combiná-los selecionando no menu "imagem", depois "cor" e "Mesclar canais". Você obtém uma imagem composta que pode ser convertida em RGB de 8 bits usando o comando "Empilhar em RGB" encontrado lá.
Você salva essa imagem, vamos chamá-la de im.tif. Finalmente, você deve converter isso em sRGB, pode fazer isso com o ImageMagick usando o comando:
convert im.tif -set colorspace RGB -colorspace sRGB output.tif
A questão restante é, então, como obter a função de spread de ponto. Na prática, se você tivesse tirado uma foto como a que está sendo discutida aqui, poderia simplesmente tirar uma foto de uma fonte pontual, por exemplo, uma estrela no F / 29 e usá-la como sua função de espalhamento pontual. Como alternativa, é possível observar limites de alto contraste e extrair a função de dispersão de pontos da maneira como os valores de cinza mudam de um valor para outro através do limite. Mas então você está tentando aprimorar a imagem da melhor maneira possível.
Nesse caso, o objetivo era compilar as funções de dispersão pontual para o canal de cores com base no que você esperaria que fosse para o F / 29, deconvolver a imagem com isso e verificar se o resultado parece ter melhorado o suficiente. Usei o Mathematica para fazer alguns cálculos e, em um programa de álgebra computacional tão avançado, é muito fácil fazer todo tipo de manipulação, incluindo a média de um intervalo de comprimento de onda e a integração de áreas de pixel para tornar o PSF mais realista.
Mas o ImageJ também permite criar uma nova imagem que você pode usar como a função de dispersão pontual. Se você clicar em "Arquivo" e depois em "Novo", poderá criar uma imagem de tamanho de 32 bits, por exemplo, 64 por 64 preenchida com preto. Você pode programar uma fórmula para os valores de cinza selecionando "processo", "Matemática" e "Macro". Para obter a função de dispersão pontual para este caso, que envolve a função Bessel aqui, você pode usar o fato de que ela é bem descrita pelos primeiros termos da expansão em série. A página do MathWorld à qual vinculei fornece expansões desta série, portanto, J 1 (x) 2 / x 2 com x = π rs / ( λF ) pode ser substituído por uma função do formato A + B s 2 + C s 4. Essa aproximação se tornará inválida se s for muito grande. Agora, sabemos que o PSF tende a zero, por exemplo, a uma distância de cerca de 5 ou 6 pixels, pode ser definido como zero. Supondo que o polinômio ainda seja pequeno nesses valores, você pode escrever a Macro como:
if(d<7) v = A + B * pow(d,2) + B * pow(d,4)
Em seguida, você cria 3 imagens para, digamos, lambda = 650 nm, 500 nm e 400 nm, ou quaisquer outros valores que considere adequados para representar a difração nos 3 canais de cores. Você pode fazer a média de alguns comprimentos de onda diferentes, criando imagens para lambda diferentes e selecionando "processo", depois "calculadora de imagem" e, em seguida, selecione "adicionar". Você pode adicionar outra imagem a esse resultado e, quando terminar de adicionar, poderá dividir para obter a média selecionando "processo", depois "matemática" e "dividir".