2017-03-08 1 views
0

이미지에 컨볼 루션 제품을 실행하고 싶습니다.Golang의 컨볼 루션

원본 이미지는 다음과 같습니다

enter image description here

그래서 나는 김프로 회선을 테스트합니다. 이 매트릭스 :

1 1 1

1 1 1

1 1 1

및 분배기 9

제가 수득

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

r, gb 값은 uint32이고, 그들은 항상 비제 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