在 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 给我的结果几乎相同。
- 1 回答
- 0 关注
- 232 浏览
添加回答
举报
0/150
提交
取消