2017-03-08 17 views
0

イメージに畳み込み積分を実行したい。ゴーランの畳み込み

元の画像は、次のとおりです。

enter image description here

だから私はGIMPで畳み込みをテストします。この行列で:

と分周器9

Iは

enter image description here

場合Iを得ます私のアルゴリズムを実行する:

enter image description here

私のアルゴリズムは次のとおりです。

エラーです
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 

} 

? ありがとうございます。

答えて

2

rg、及びbuint32値であり、それらは非ゼロの8ビット値として開始された場合は常に255よりも大きい色情報の16ビットを含みます。

これで、RGBA値を操作することはできません。uint8に切り捨てられます。最下位ビットは8ビット値の小数部分であるため、無駄な結果が得られます。

候補の整数値を最大16ビット値65535と比較し、それを切り捨てる前に8ビットシフトして8つの最上位ビットを得る。

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

ありがとうございました! – Oneill

関連する問題