Почему моя бикубическая интерполяция дискретных данных выглядит ужасно?
У меня есть массив данных высот 128x128 (высота от -400 м до 8000 м отображается с использованием 9 цветов), и мне нужно изменить его размер до 512x512. Я сделал это с бикубической интерполяцией, но результат выглядит странно. На картинке вы можете увидеть оригинал, ближайший и бикубический. Примечание: интерполируются только данные высот, а не сами цвета (гамма сохраняется). Эти артефакты, видимые на бикубическом изображении, являются результатом моего неверного кода интерполяции или они вызваны интерполяцией дискретных (9 шагов) данных?
2 ответа
Должно быть что-то не так с используемым вами бикубическим кодом. Вот мой результат с 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')
Редактировать: Очевидно, что Bicubic Python тоже не лучший. Вот что я смог сделать вручную в Paint Shop Pro, используя примерно ту же процедуру, что и выше.
Хотя бикубическая интерполяция может иногда генерировать интерполяционные значения за пределами исходного диапазона (можете ли вы проверить, происходит ли это с вами?), Действительно кажется, что у вас может быть ошибка, но трудно сказать, не глядя на код. Как правило, бикубическое решение должно быть более гладким, чем решение ближайшего соседа.
Изменить: Я забрал это, я не вижу интерполяции значений за пределами исходного диапазона в ваших изображениях. Тем не менее, я думаю, что странная часть - это "неровность", которую вы получаете при использовании бикубической системы, вы можете проверить это дважды.