2017-05-23 2 views
0

J'essaye d'implémenter un noyau de filtrage d'image à une image, dans lequel j'utilise une matrice de filtrage pour filtrer l'image. Cependant, je ne comprends pas vraiment comment les pixels limites sont traités. J'ai supposé que tous les pixels de filtre tombant hors limites dans l'image sont réfléchis sur leur bord respectif. Quelqu'un peut-il expliquer cela plus clairement pour moi?Convolution d'encapsulation du noyau image C++

Merci!

Répondre

0

Il n'y a pas de réponse. Vous pouvez refléter le pixel limite, qui est généralement la meilleure option, ou vous pouvez envelopper, ce qui est plus facile et parfois correct si l'image ressemble à un tore. Ou vous pouvez garnir de gris. Mais vous obtiendrez un effet de bord quoi que vous fassiez.

Généralement, il est plus facile d'ajouter les pixels de remplissage plutôt que d'essayer de protéger les bords dans le code de convolution lui-même.

0

Eh bien, il y a plusieurs façons de traiter les pixels limites dans l'image. Un élément courant consiste à remplir la matrice d'image avec une ligne et une colonne supplémentaires afin d'avoir des voisins pour ces pixels limites (voisins qui sont nécessaires dans l'opération de convolution du noyau).

Par exemple, vous avez ce n x n matrice d'image:

a[0][0] a[0][1] ... a[0][n-1] 
a[1][0] a[1][1] ... a[1][n-1] 
    .   .    . 
    .   .    . 
    .   .    . 
a[n-1][0] a[n-1][1] ... a[n-1][n-1] 

Vous devez pad en mettant la première ligne en dessous de la ligne n-ième et la ligne n-ième au-dessus de la première ligne. De plus, la première colonne est copiée après la dernière colonne et la dernière colonne avant la première.

a[n-1][n-1] a[n-1][0] a[n-1][1] ... a[n-1][n-1] a[n-1][0] 

a[0][n-1]  a[0][0] a[0][1] ... a[0][n-1]  a[0][0] 
a[1][n-1]  a[1][0] a[1][1] ... a[1][n-1]  a[1][0] 
    .    .   .    .    . 
    .    .   .    .    . 
    .    .   .    .    . 
a[n-1][n-1] a[n-1][0] a[n-1][1] ... a[n-1][n-1] a[n-1][0] 

a[0][n-1]  a[0][0] a[0][1] ... a[0][n-1]  a[0][0] 

Comme vous pouvez le voir, les coins sont réfléchis de manière symétrique. Le coin supérieur gauche de la nouvelle bordure prend la valeur de l'élément en bas à droite dans la matrice initiale. Vous obtenez une matrice (n + 2) x (n + 2) sur laquelle vous appliquez l'opération de convolution du noyau.