Почему моя бикубическая интерполяция дискретных данных выглядит ужасно?

У меня есть массив данных высот 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, используя примерно ту же процедуру, что и выше.

Бикубик в Paint Shop Pro

Хотя бикубическая интерполяция может иногда генерировать интерполяционные значения за пределами исходного диапазона (можете ли вы проверить, происходит ли это с вами?), Действительно кажется, что у вас может быть ошибка, но трудно сказать, не глядя на код. Как правило, бикубическое решение должно быть более гладким, чем решение ближайшего соседа.

Изменить: Я забрал это, я не вижу интерполяции значений за пределами исходного диапазона в ваших изображениях. Тем не менее, я думаю, что странная часть - это "неровность", которую вы получаете при использовании бикубической системы, вы можете проверить это дважды.

Другие вопросы по тегам