C’est la détection des frontières. La recherche des contours d’objets est un des problèmes les plus étudiés depuis l’origine des travaux sur l’imagerie. Dû à la nature très intuitive du contour qui apparaît très naturellement comme l’indice visuel idéal dans la plus grande partie des situations. es contours sont les lieux de variations significatives de l’information niveaux de gris. Dans une image de mosaïque de régions parfaitement homogènes, les transitions sont strictes, et le contour doit être une chaîne de pixels d’épaisseur 1.
La notion de contour étant reliée à celle de variation, c’est une évaluation de la variation en chaque pixel. Une variation existera si le gradient est localement maximum ou si la dérivée seconde présente un passage par zéro.
Principe de détection : filtre passe haut Approche gradient :
Approche Gradient:
En considérant l’image dans un repère orthogonal (Oxy) tel que (Ox) désigne l’axe horizontal et (Oy) l’axe vertical, le Gradient de l’image (la luminance f ) en tout point ou pixel de coordonnées (x,y) est désigné par :
Le module du gradient permet de quantifier l’importance du contour mis en évidence, c’est‐à‐dire l’amplitude du saut d’intensité relevé dans l’image :
La direction du gradient permet de déterminer l’arête présente dans l’image. La direction du gradient est orthogonale à celle du contour :
Le principe de la détection de contours par l’utilisation du gradient consiste à calculer d’abord le gradient de l’image dans deux directions orthogonales puis le module du gradient. Puis sélectionner es contours les plus marqués, c’est‐à‐dire les points de plus fort contraste par un seuillage adéquat, les directions des contours étant orthogonales à la direction α0 déterminée en tout pixel de l’image:
Approximation de base
Opérateur de Roberts
Ce masque proposé en 1965 permet de calculer un gradient le long des diagonales de l’image :
input_image = imread('boat.png'); input_image = uint8(input_image); input_image = double(input_image); filtered_image = zeros(size(input_image)); % Masque de Robert Mx = [1 0; 0 -1]; My = [0 1; -1 0]; for i = 1:size(input_image, 1) - 1 for j = 1:size(input_image, 2) - 1 Gx = sum(sum(Mx.*input_image(i:i+1, j:j+1))); Gy = sum(sum(My.*input_image(i:i+1, j:j+1))); filtered_image_x(i, j) = Gx; filtered_image_y(i, j) = Gy; filtered_image(i, j) = sqrt(Gx.^2 + Gy.^2); end end input_image = uint8(input_image); filtered_image = uint8(filtered_image); filtered_image_x = uint8(filtered_image_x); filtered_image_y = uint8(filtered_image_y); subplot (2,2,1), imshow(input_image), title('input image'); subplot (2,2,2), imshow(filtered_image_x), title('Contour horizontaux'); subplot (2,2,3), imshow(filtered_image_y), title('Contour verticaux'); subplot (2,2,4), imshow(filtered_image), title('Module (Robert)');
Opérateurs de Prewitt et Sobel
Le calcul de gradient est mené par l’intermédiaire de deux masques, le premier effectuant un gradient horizontal, le second un gradient vertical. Là encore, le deuxième masque se déduit du premier par une rotation de . Les masques sont donnés ci-dessous pour les contours horizontaux puis verticaux.
Lorsque c=1, il s’agit des opérateurs de Prewitt, lorsque c=2, de ceux de Sobel. Par rapport aux précédents, ces masques ont l’avantage de produire deux effets. Outre le calcul du gradient dans une direction, ces masques effectuent un lissage dans la direction orthogonale. Ce lissage rend ces masques un peu moins sensibles au bruit que les précédents.
Implémentation:
Implémentation Matlab
% filtre Sobel input_image = imread('boat.png'); input_image = uint8(input_image); %input_image = rgb2gray(input_image); input_image = double(input_image); filtered_image = zeros(size(input_image)); % filtre Masque Sobel Mx = [-1 0 1; -2 0 2; -1 0 1]; My = [1 2 1 ; 0 0 0 ; -1 -2 -1]; for i = 2:size(input_image, 1) - 1 for j = 2:size(input_image, 2) - 1 Gx = sum(sum(Mx.*input_image(i-1:i+1, j-1:j+1))); Gy = sum(sum(My.*input_image(i-1:i+1, j-1:j+1))); filtered_image_x(i, j) = Gx; filtered_image_y(i, j) = Gy; filtered_image(i, j) = sqrt(Gx.^2 + Gy.^2); end end input_image = uint8(input_image); filtered_image = uint8(filtered_image); filtered_image_x = uint8(filtered_image_x); filtered_image_y = uint8(filtered_image_y); subplot (2,2,1), imshow(input_image), title('Image initiale'); subplot (2,2,2), imshow(filtered_image_x), title('Contour horizontaux'); subplot (2,2,3), imshow(filtered_image_y), title('Contour verticaux'); subplot (2,2,4), imshow(filtered_image), title('Module (Sobel)');
Exp. : Opérateur de Prewitt
Détection de contours : Approche Laplacien
Les opérateurs de gradient exploitent le fait qu’un contour dans une image correspond au maximum du gradient dans la direction orthogonale au contour. Or le passage par zéro de la dérivée seconde d’une rupture d’intensité permet également de mettre en évidence le contour. La dérivée seconde est déterminée par le calcul du Laplacien :
Or
et
Ainsi le Laplacien:
Le calcul de Laplacien peut alors être appliquée par la convolution de l’image avec le masque suivant :
d’autres masques peuvent être utilisés:
Cette convolution est très sensible au bruit en raison de la double dérivation. Un seuillage peut être utilisé pour ne prendre en compte que les passages par zéro d’amplitude relativement élevée et qui correspondent à des vrais contours de l’image.
Remède contre la sensibilité au bruit
l’idée consiste d’abord à filtrer passe‐bas l’image avant d’appliquer l’opérateur Laplacien.
Avantages: proche du mécanisme de la vision humaine. Un seul paramètre et pas de seuil de significativité de l’amplitude et Contours fermés
Inconvénients : Plus grande sensibilité au bruit, pas d’information sur l’orientation du contour.
Autres approches très utilisés: Critères de Canny, Filtre de Shen‐Castan, Filtre de Deriche et les snackes.
Code Matlab:
I = imread('coins.png'); BW1 = edge(I,'sobel'); BW2 = edge(I,'prewitt'); BW3 = edge(I,'canny'); subplot ( 2 , 2 , 1 ) ; imshow(I) ; title ( 'Image originale' ) ; subplot ( 2 , 2 , 2 ) ; imshow(BW1) ; title ( 'Contour avec Sobel' ) ; subplot ( 2 , 2 , 3 ) ; imshow(BW2) ; title ( 'Contour avec prewitt' ) ; subplot ( 2 , 2 , 4 ) ; imshow(BW3) ; title ( 'Contour avec Canny' ) ;