Golang 中的卷积
Convolution in Golang
我想在图像上执行卷积乘积。
原图为:
所以我用 gimp 测试了卷积。使用此矩阵:
1 1 1
1 1 1
1 1 1
和分频器 9
我获得
当我执行我的算法时,我得到:
我的算法是:
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
}
错误在哪里?
谢谢您的帮助。
r
、g
和 b
是 uint32
值,它们包含 16 位颜色信息,如果以非零 8 位值。
然后您不能对 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),
我想在图像上执行卷积乘积。
原图为:
所以我用 gimp 测试了卷积。使用此矩阵:
1 1 1
1 1 1
1 1 1
和分频器 9
我获得
当我执行我的算法时,我得到:
我的算法是:
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
}
错误在哪里? 谢谢您的帮助。
r
、g
和 b
是 uint32
值,它们包含 16 位颜色信息,如果以非零 8 位值。
然后您不能对 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),