Nitidez de Imagem e Detecção de Bordas

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.

Tags: MATLAB Processamento de Imagem Detecção de Bordas Operador de Sobel Operador de Canny

Publicado em 6-7 23:08 por Thomas