image-processing - Golang 中的卷积

标签 image-processing go convolution

我想在图像上执行卷积乘积。

原图为:

enter image description here

所以我用 gimp 测试卷积。使用此矩阵:

1 1 1

1 1 1

1 1 1

和分隔线9

我得到

enter image description here

当我执行我的算法时,我得到:

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

}

错误在哪里? 谢谢您的帮助。

最佳答案

rgbuint32值,它们包含16bits的颜色信息,即如果以非零 8 位值开始,则始终大于 255。

然后您不能对 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),

关于image-processing - Golang 中的卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677196/

相关文章:

python - 在python中更快的图像像素处理

go - 如何在Go中通过名称设置结构字段的复合字段?

go - 在golang中全局设置时区

go - 如何查询和处理使用 go.uuid 创建并插入到 PostgreSQL 11 中的 UUID?

python - CNTK 卷积1d

machine-learning - 卷积降低一维向量的维数

r - 为什么这个 R 代码没有产生相同的结果? (卷积与 FFT)

python - Ipython 的 Vlfeat

python - 通过Python从图像中提取椭圆形食物盘

c++ - 关于阈值技术/图像二值化的建议