No processamento digital de imagens, a nitidez é empregada para ressaltar transições abruptas de intensidade, identificadas como bordas. A técnica envolve acentuar mudanças locais no brilho dos pixels.
Tipos de Bordas
As bordas podem ser categorizadas em três tipos principais:
- Bordas finas: caracterizadas por linhas estreitas.
- Bordas abruptas: transições bruscas de intensidade.
- Bordas graduais: variações suaves de brilho.
Para bordas abruptas, a primeira derivada atinge valores extremos, enquanto para bordas finas, a primeira derivada é nula.
Operadores de Primeira Derivada
Estes métodos são eficazes para detecção de bordas abruptas. A essência da nitidez consiste em combinar a imagem original com o gradiente para amplificar variações.
Operador de Gradiente
O cálculo do gradiente baseia-se em aproximações de derivadas. Pixels fora da região processada são definidos como zero.
% Implementação manual do gradiente
clear, clc;
img_original = im2double(rgb2gray(imread('foto3.jpg')));
figure; imshow(img_original); title('Imagem de Entrada');
[linhas, colunas] = size(img_original);
img_gradiente = zeros(linhas, colunas); % Inicializa com zeros
for col = 1:colunas-1
for lin = 1:linhas-1
% Calcula diferenças horizontal e vertical
delta_h = abs(img_original(lin, col+1) - img_original(lin, col));
delta_v = abs(img_original(lin+1, col) - img_original(lin, col));
img_gradiente(lin, col) = delta_h + delta_v;
end
end
figure; imshow(img_gradiente); title('Gradiente Obtido');
img_nitida = img_original + img_gradiente;
figure; imshow(img_nitida); title('Imagem com Nitidez Aplicada');
Operador de Roberts
Este operador utiliza diferenças cruzadas entre pixels vizinhos. A função imfilter realiza convolução com preenchimento por zeros no contorno.
% Detecção de bordas com Roberts
clear, clc;
img_original = im2double(rgb2gray(imread('foto3.jpg')));
figure; imshow(img_original); title('Imagem Original');
% Roberts via função edge
bordas_roberts = edge(img_original, 'roberts');
figure; imshow(bordas_roberts); title('Bordas (Roberts)');
% Aplicação manual das máscaras
mascara1 = [1 0; 0 -1];
mascara2 = [0 1; -1 0];
resp1 = imfilter(img_original, mascara1);
resp2 = imfilter(img_original, mascara2);
img_grad_roberts = abs(resp1) + abs(resp2);
figure; imshow(img_grad_roberts); title('Gradiente Roberts');
img_nitida_roberts = img_original + img_grad_roberts;
figure; imshow(img_nitida_roberts); title('Nitidez com Roberts');
A escolha do limiar influencia significativamente o resultado da detecção.
Operador de Sobel
Baseado em diferanças ponderadas entre pixels adjacentes. A fórmula considera uma média de diferenças simétricas.
% Nitidez usando Sobel
clear, clc;
img_original = im2double(rgb2gray(imread('foto3.jpg')));
figure; imshow(img_original); title('Entrada');
% Sobel via edge
bordas_sobel = edge(img_original, 'sobel');
figure; imshow(bordas_sobel); title('Bordas (Sobel)');
% Máscaras Sobel
kernel_h = [-1 -2 -1; 0 0 0; 1 2 1];
kernel_v = [-1 0 1; -2 0 2; -1 0 1];
res_h = imfilter(img_original, kernel_h);
res_v = imfilter(img_original, kernel_v);
img_grad_sobel = abs(res_h) + abs(res_v);
figure; imshow(img_grad_sobel); title('Gradiente Sobel');
img_nitida_sobel = img_original + img_grad_sobel;
figure; imshow(img_nitida_sobel); title('Nitidez Sobel');
Operador de Prewitt
Utiliza oito máscaras para capturar bordas em diferentes orientações. A combinação maximiza a resposta das bordas.
% Prewitt com múltiplas direções
img_original = im2double(rgb2gray(imread('foto3.jpg')));
% Definição das máscaras
kernels_prewitt = {
[-1 -1 -1; 0 0 0; 1 1 1], [0 -1 -1; 1 0 -1; 1 1 0];
[1 0 -1; 1 0 -1; 1 0 -1], [1 1 0; 1 0 -1; 0 -1 -1];
[1 1 1; 0 0 0; -1 -1 -1], [0 1 1; -1 0 1; -1 -1 0];
[-1 0 1; -1 0 1; -1 0 1], [-1 -1 0; -1 0 1; 0 1 1]
};
respostas = cellfun(@(k) imfilter(img_original, k), kernels_prewitt, 'UniformOutput', false);
grad_maximo = max(cat(3, respostas{:}), [], 3); % Máximo entre todas as respostas
img_grad_prewitt = abs(grad_maximo);
img_nitida_prewitt = img_original + img_grad_prewitt;
figure; imshow(img_grad_prewitt); title('Gradiente Prewitt');
figure; imshow(img_nitida_prewitt); title('Nitidez Prewitt');
Operadores de Segunda Derivada
Estes métodos destacam bordas finas, como linhas, ao calcular a segunda derivada da intensidade.
Operador Laplaciano
O Laplaciano realça descontinuidades através de um kernel isotrópico. Para nitidez, ele é combinado com a imagem original.
% Nitidez com Laplaciano
clear, clc;
img_original = im2double(rgb2gray(imread('foto3.jpg')));
figure; imshow(img_original); title('Imagem Original');
% Laplaciano padrão
kernel_lap = fspecial('laplacian', 0);
resp_lap = imfilter(img_original, kernel_lap);
img_grad_lap = abs(resp_lap);
figure; imshow(img_grad_lap); title('Resposta Laplaciana');
% Kernel para nitidez
kernel_nitidez = [0 -1 0; -1 5 -1; 0 -1 0];
img_nitida_lap = imfilter(img_original, kernel_nitidez);
figure; imshow(img_nitida_lap); title('Nitidez Laplaciana');
Técnicas Avançadas
O operador de Canny é considerado o método mais robusto para detecção de bordas, pois integra suavização prévia e limiarização.
No domínio da frequência, a nitidez pode ser obtida por filtragem passa-alta, uma vez que as bordas correspondem a componentes de alta frequência. O procedimento inverte o efeito de filtros pasa-baixa.