猿问

在 Golang 中使用 Lanczos 重采样的粗糙边缘

在 Golang 中使用 Lanczos 重采样的粗糙边缘

1



1

我一直在写一些在 Golang 中调整图像大小的基本方法。我看过几篇关于调整图像大小的帖子,但对于我的生活,我无法弄清楚我错过了什么......


本质上,我的问题是在 Golang 中调整图像大小时,我的结果似乎有很多锯齿。


我已经尝试迭代地对图像进行下采样,但这并没有带来太大的改进。


这是我的代码:


func resize(original image.Image,

    edgeSize int, filterSize int) image.Image {


    oldBounds := original.Bounds()

    if oldBounds.Dx() < edgeSize && oldBounds.Dy() < edgeSize {

        // No resize necessary

        return original

    }


    threshold := edgeSize * 4 / 3

    if oldBounds.Dx() > threshold || oldBounds.Dy() > threshold {

        fmt.Println("Upstream")

        original = customResizeImageToFitBounds(original, threshold, filterSize)

        oldBounds = original.Bounds()

    }


    newBounds := getNewBounds(oldBounds, edgeSize)


    resized := image.NewRGBA(newBounds)


    var ratioX = float64(oldBounds.Dx()) / float64(newBounds.Dx())

    var ratioY = float64(oldBounds.Dy()) / float64(newBounds.Dy())


    for x := 0; x < newBounds.Dx(); x++ {

        for y := 0; y < newBounds.Dy(); y++ {

            sourceX := ratioX * float64(x)

            minX := int(math.Floor(sourceX))


            sourceY := ratioY * float64(y)

            minY := int(math.Floor(sourceY))


            sampleSize := filterSize<<1 + 1

            var xCoeffs = make([]float64, sampleSize)

            var yCoeffs = make([]float64, sampleSize)


            var sumX = 0.0

            var sumY = 0.0

            for i := 0; i < sampleSize; i++ {

                xCoeffs[i] = lanczos(filterSize, sourceX-float64(minX+i-filterSize))

                yCoeffs[i] = lanczos(filterSize, sourceY-float64(minY+i-filterSize))


                sumX += xCoeffs[i]

                sumY += yCoeffs[i]

            }


            for i := 0; i < sampleSize; i++ {

                xCoeffs[i] /= sumX

                yCoeffs[i] /= sumY

            }


能不是特别好,因为我想在查看优化之前获得高质量的结果。


有图像重采样经验的人有没有看到任何潜在的问题?


墨色风雨
浏览 234回答 1
1回答

jeck猫

好吧,我想我找到了一种解决混叠问题的方法。我没有使用 lanczos3,而是使用双线性插值对源图像重新采样,其尺寸略高于我想要的尺寸(edgeSize = 1080),高斯模糊图像,然后将图像缩小到目标尺寸(edgeSize = 600) ,这次是双三次插值。这给我的结果与 RMagick 给我的结果几乎相同。
随时随地看视频慕课网APP

相关分类

Go
我要回答