【发布时间】:2012-07-21 21:54:30
【问题描述】:
我有一个 128x128 的高程数据数组(使用 9 种颜色显示从 -400m 到 8000m 的高程),我需要将其调整为 512x512。我用双三次插值做到了,但结果看起来很奇怪。在图片中,您可以看到原始的、最近的和双三次的。注意:仅对高程数据进行插值,而不对颜色本身进行插值(保留色域)。在双三次图像上看到的这些伪影是我的错误插值代码造成的,还是由离散(9 步)数据的插值引起的?
【问题讨论】:
我有一个 128x128 的高程数据数组(使用 9 种颜色显示从 -400m 到 8000m 的高程),我需要将其调整为 512x512。我用双三次插值做到了,但结果看起来很奇怪。在图片中,您可以看到原始的、最近的和双三次的。注意:仅对高程数据进行插值,而不对颜色本身进行插值(保留色域)。在双三次图像上看到的这些伪影是我的错误插值代码造成的,还是由离散(9 步)数据的插值引起的?
【问题讨论】:
您使用的双三次代码一定有问题。这是我使用 Python 得到的结果:
外部的黑色边框是由于振铃导致结果超出调色板的位置。
这是产生上述内容的程序:
from PIL import Image
im = Image.open(r'c:\temp\temp.png')
# convert the image to a grayscale with 8 values from 10 to 17
levels=((0,0,255),(1,255,0),(255,255,0),(255,0,0),(255,175,175),(255,0,255),(1,255,255),(255,255,255))
img = Image.new('L', im.size)
iml = im.load()
imgl = img.load()
colormap = {}
for i, color in enumerate(levels):
colormap[color] = 10 + i
width, height = im.size
for y in range(height):
for x in range(width):
imgl[x,y] = colormap[iml[x,y]]
# resize using Bicubic and restore the original palette
im4x = img.resize((4*width, 4*height), Image.BICUBIC)
palette = []
for i in range(256):
if 10 <= i < 10+len(levels):
palette.extend(levels[i-10])
else:
palette.extend((i, i, i))
im4x.putpalette(palette)
im4x.save(r'c:\temp\temp3.png')
编辑:显然 Python 的 Bicubic 也不是最好的。以下是我在 Paint Shop Pro 中使用与上述大致相同的步骤手动完成的操作。
【讨论】:
虽然双三次插值有时会生成原始范围之外的插值(您能验证一下这是否发生在您身上吗?)看起来您确实可能有错误,但如果不看代码就很难说。作为一般规则,双三次解应该比最近邻解更平滑。
编辑:我收回这一点,我在您的图像中看不到超出原始范围的插值。不过,我认为奇怪的部分是使用 bicubic 时出现的“锯齿状”,您可能需要仔细检查一下。
【讨论】: