Je sais que cette question peut ne pas être très pertinente pour la programmation, mais si je ne comprends pas la théorie derrière le traitement d'image, je ne pourrai jamais mettre en œuvre quelque chose dans la pratique.
Si je comprends bien, les filtres gaussiens sont convolués avec une image pour la réduction du bruit car ils calculent une moyenne pondérée du voisinage d'un pixel et ils sont très utiles pour la détection des contours, car vous pouvez appliquer un flou et dériver l'image en même temps en convoluant simplement avec la dérivée d'une fonction gaussienne.
Mais quelqu'un peut-il m'expliquer ou me donner des références sur la façon dont ils sont calculés?
Par exemple, le détecteur de bord de Canny parle d'un filtre gaussien 5x5, mais comment ont-ils obtenu ces nombres particuliers? Et comment sont-ils passés d'une convolution continue à une multiplication matricielle?
Réponses:
Pour que cette opération fonctionne, vous devez imaginer que votre image est remodelée en tant que vecteur. Ensuite, ce vecteur est multiplié à sa gauche par la matrice de convolution afin d'obtenir l'image floue. Notez que le résultat est également un vecteur de la même taille que l'entrée, c'est-à-dire une image de la même taille.
Chaque ligne de la matrice de convolution correspond à un pixel dans l'image d'entrée. Il contient le poids des contributions de tous les autres pixels de l'image à la contrepartie floue du pixel considéré.
Prenons un exemple: boîte flou de taille pixels sur une image de taille 6 × 6 pixels. L'image remodelée est une colonne de 36 choix, tandis que la matrice de flou a une taille 36 × 36 .3 × 3 6 × 6 36 × 36
Une illustration visuelle d'un processus étroitement lié (convolution + soustraction) peut être trouvée sur ce billet de blog (à partir de mon blog personnel).
la source
Pour les applications aux images ou aux réseaux de convolution, pour utiliser plus efficacement les multiplicateurs matriciels dans les GPU modernes, les entrées sont généralement remodelées en colonnes d'une matrice d'activation qui peut ensuite être multipliée avec plusieurs filtres / noyaux à la fois.
Consultez ce lien depuis le CS231n de Stanford et faites défiler jusqu'à la section «Implémentation en tant que multiplication matricielle» pour plus de détails.
Le processus fonctionne en prenant tous les correctifs locaux sur une image d'entrée ou une carte d'activation, ceux qui seraient multipliés avec le noyau, et en les étirant dans une colonne d'une nouvelle matrice X via une opération communément appelée im2col. Les noyaux sont également étirés pour remplir les rangées d'une matrice de poids W de sorte que lors de l'exécution de l'opération de matrice W * X, la matrice résultante Y ait tous les résultats de la convolution. Enfin, la matrice Y doit être remodelée à nouveau en reconvertissant les colonnes en images par une opération généralement appelée cal2im.
la source
La convolution dans le domaine temporel est égale à la multiplication matricielle dans le domaine fréquentiel et vice versa.
Le filtrage est équivalent à la convolution dans le domaine temporel et donc à la multiplication matricielle dans le domaine fréquentiel.
Quant aux cartes ou masques 5x5, ils proviennent de la discrétisation des opérateurs canny / sobel.
la source
J'ai écrit une fonction qui résout cela dans mon référentiel GitHub StackOverflow Q2080835 (Jetez un oeil à
CreateImageConvMtx()
).En fait, la fonction peut prendre en charge n'importe quelle forme de convolution que vous souhaitez -
full
,same
etvalid
.Le code est le suivant:
J'ai également créé une fonction pour créer une matrice pour le filtrage d'images (idées similaires à MATLAB
imfilter()
):Le code a été validé par rapport à MATLAB
imfilter()
.Le code complet est disponible dans mon référentiel GitHub StackOverflow Q2080835 .
la source