为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
墨色风雨 2022-03-02 13:08:40
在 Golang 中使用 Lanczos 重采样的粗糙边缘11我一直在写一些在 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            }能不是特别好,因为我想在查看优化之前获得高质量的结果。有图像重采样经验的人有没有看到任何潜在的问题?
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

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


查看完整回答
反对 回复 2022-03-02
  • 1 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信