Filtre Sobel per a Detecció de Vores en Imatges¶
Introducció¶
Aquest notebook explica com aplicar el filtre Sobel a una imatge per detectar-ne les vores. La detecció de vores és un pas crucial en moltes aplicacions de processament d'imatges, com ara el reconeixement de caràcters òptics (OCR), la visió per computador, i altres aplicacions d'intel·ligència artificial. Aprendrem a carregar, redimensionar i processar una imatge amb el filtre Sobel utilitzant numpy, Pillow i matplotlib.
- Llibreries Necessàries
Comencem important les llibreries necessàries per a aquest exercici: Pillow (PIL) per carregar i guardar la imatge, numpy per a les operacions matemàtiques i matplotlib per visualitzar les imatges.
- Carregar i Redimensionar la Imatge
Tasca: Carrega una imatge en escala de grisos i guarda-la en una matriu numpy. Redimensiona la imatge abans de carregar-la si és massa gran, per facilitar els càlculs. Pseudocodi:
1. Utilitza la llibreria Pillow per carregar la imatge.
2. Converteix la imatge a escala de grisos (opcional, però recomanat per aquest filtre).
3. Converteix la imatge a una matriu `numpy`.
4. Guarda aquesta matriu com `img_array`.
- Definir els Nuclis del Filtre Sobel
Objectiu:
Els nuclis Sobel Gx i Gy s'utilitzen per detectar canvis en la intensitat de la imatge en les direccions horitzontal i vertical.
Pseudocodi:
Defineix els nuclis Sobel de 3x3:
- Gx = [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
- Gy = [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]
- Aplicar el Filtre Sobel
Tasca:
Implementa el filtre Sobel aplicant una convolució a cada píxel de la imatge, excepte els de la vora. Calcula la magnitud del gradient per obtenir les vores detectades.
Pseudocodi:
1. Crea una matriu `edges` buida amb la mateixa mida que `img_array` per emmagatzemar el resultat.
2. Per a cada píxel `img_array[i, j]` dins del rang (excepte els de la vora):
a. Extreu un bloc de 3x3 al voltant del píxel (i, j).
b. Calcula Ix aplicant la convolució entre el bloc i `Gx`:
- Multiplica cada element del bloc per l'element corresponent de `Gx` i suma tots els resultats.
c. Calcula Iy aplicant la convolució entre el bloc i `Gy` de la mateixa manera.
d. Calcula la magnitud del gradient com `sqrt(Ix^2 + Iy^2)`.
e. Guarda aquest valor a `edges[i, j]`.
3. (Opcional) Normalitza `edges` per ajustar els valors entre 0 i 255 per una millor visualització.
Notes:
Tingues en compte els píxels de la vora, ja que no tenen veïns complets per formar blocs de 3x3. Una opció és ometre aquests píxels. Assegura't que edges sigui una matriu amb valors adequats per a una imatge (0 a 255).
- Visualitzar la Imatge de les Vores
Per veure els resultats, mostra la imatge de edges en escala de grisos.
Pseudocodi:
1. Utilitza `matplotlib` per mostrar `edges` com a imatge.
2. Defineix la colormap com "gray" per visualitzar la imatge en escala de grisos.
3. Amaga els eixos per una millor visualització.
- Guardar la Imatge Resultant
Per conservar el resultat, guarda la imatge de les vores detectades en un fitxer.
Pseudocodi:
1. Converteix `edges` a format uint8 (escala de 0 a 255) si no ho està ja.
2. Crea una imatge amb Pillow utilitzant `edges`.
3. Guarda la imatge resultant amb un nom com "vores_detectades.png".
Conclusió¶
La detecció de vores és un procés essencial en moltes aplicacions de processament d'imatges i visió per computador, com:
- OCR (Reconeixement Òptic de Caràcters): Els filtres de vores ajuden a identificar les lletres i caràcters separant les zones d'interès (contorns) del fons.
- Visió per Computador: La detecció de vores ajuda a localitzar objectes en sistemes automàtics i robots.
- Anàlisi d’Imatges Mèdiques: La detecció de contorns ajuda a ressaltar òrgans i altres estructures.
Aquest exercici ofereix una introducció a les tècniques de convolució en imatges, un component fonamental en les aplicacions d’intel·ligència artificial i processament d'imatges.