2017-03-08 1 views
0

Je souhaite exécuter un produit de convolution sur une image.Convolution dans Golang

L'image originale est:

enter image description here

donc je teste la convolution avec gimp. Avec cette matrice:

et le diviseur 9

j'obtenir

enter image description here

Lorsque I exécute mon algorithme j'obtiens:

enter image description here

Mon algorithme est:

func Convolution(img *image.Image, matrice [][]int) *image.NRGBA { 
    imageRGBA := image.NewNRGBA((*img).Bounds()) 
    w := (*img).Bounds().Dx() 
    h := (*img).Bounds().Dy() 
    sumR := 0 
    sumB := 0 
    sumG := 0 
    var r uint32 
    var g uint32 
    var b uint32 
    for y := 0; y < h; y++ { 
     for x := 0; x < w; x++ { 

      for i := -1; i <= 1; i++ { 
       for j := -1; j <= 1; j++ { 

        var imageX int 
        var imageY int 

        imageX = x + i 
        imageY = y + j 

        r, g, b, _ = (*img).At(imageX, imageY).RGBA() 
        sumG = (sumG + (int(g) * matrice[i+1][j+1])) 
        sumR = (sumR + (int(r) * matrice[i+1][j+1])) 
        sumB = (sumB + (int(b) * matrice[i+1][j+1])) 
       } 
      } 

      imageRGBA.Set(x, y, color.NRGBA{ 
       uint8(min(sumR/9, 255)), 
       uint8(min(sumG/9, 255)), 
       uint8(min(sumB/9, 255)), 
       255, 
      }) 

      sumR = 0 
      sumB = 0 
      sumG = 0 

     } 
    } 

    return imageRGBA 

} 

Où sont l'erreur? Nous vous remercions de votre aide.

Répondre

2

r, g et b sont uint32 valeurs, et ils contiennent 16bits d'information couleur qui est toujours supérieure à 255 si commencé comme une valeur non nulle 8 bits. Vous ne pouvez pas utiliser les valeurs RGBA et les tronquer à uint8; cela vous donne un résultat inutile car les bits les moins significatifs ne sont que des parties fractionnaires des valeurs 8bit.

Comparer la valeur entière candidate avec la valeur maximale de 16 bits 65535, et la décaler de 8 bits avant de la tronquer pour obtenir les 8 bits les plus significatifs.

uint8(min(sumR/9, 0xffff) >> 8), 
uint8(min(sumG/9, 0xffff) >> 8), 
uint8(min(sumB/9, 0xffff) >> 8), 
+0

Merci beaucoup! – Oneill