Реализация Флойда-Стейнберга Python

Я использую сглаживание Флойда-Стейнберга, чтобы рассеять ошибку квантования после обработки изображения с помощью KMeans из scipy. Приведенные данные представляют собой файл RGB - как для оттенков серого, так и для цвета. Проблема в визуализации - я не получаю дизеринга.

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

im = Image.open('file.png').convert('RGB')
pic = np.array(im, dtype = np.float)/255
im.close()

Я хотел бы опустить часть KMeans и сосредоточиться на Floyd-Steinberg:

"""pic - as above, original array; image - processed image"""

def dither(pic, image):
    v, c, s = pic.shape
    Floyd = np.copy(image)
    for i in range(1, v-1):
        for j in range(1, c-1):
            quan = pic[i][j] - image[i][j] #Quantization error
            Floyd[i][j + 1] = quan * (np.float(7 / 16)) + Floyd[i][j + 1]
            Floyd[i + 1][j - 1] = quan * (np.float(3 / 16)) + Floyd[i + 1][j - 1]
            Floyd[i + 1][j] = quan * (np.float(5 / 16)) + Floyd[i + 1][j]
            Floyd[i + 1][j + 1] = quan * (np.float(1 / 16)) + Floyd[i + 1][j + 1]
    return Floyd

Floyd = dither(pic, image)

plt.imshow(Floyd)
plt.show()

Я получаю небольшое сглаживание, когда заменяю Floyd на pic, то есть Floyd[i + 1][j] = quan * (np.float(5 / 16)) + pic[i + 1][j]. Однако это неправильный код! Кроме того, мне приходится иметь дело с цветами из кластеров, поэтому я снова оцениваю новые пиксели в кластерах. Как я могу заставить его работать? Где ЭТА решающая ошибка?


person fgh    schedule 26.04.2019    source источник
comment
Что такое image? Как вы это обработали? У вас принципиальное непонимание процесса. У вас должно быть только одно изображение: вы изменяете входное изображение с оттенками серого, устанавливая для каждого пикселя значение 0 или 1 и распространяя разницу с исходным значением на следующие пиксели, которые еще предстоит обработать. Это означает, что ваш алгоритм должен читать только из Floyd, а не из image или pic. И Floyd должно быть копией pic, исходного изображения.   -  person Cris Luengo    schedule 27.04.2019
comment
Спасибо за ваш ответ. Мне удалось улучшить код, и я хотел бы опубликовать его как ответ. Однако, в силу некоторых обстоятельств, я могу сесть за это только в понедельник. Хотя я исправил ошибки до того, как прочитал вашу подсказку, я считаю ваш комментарий очень полезным. Жаль, что я не прочитал о тех фундаментальных недоразумениях три дня назад, когда я начал борьбу с кодом...   -  person fgh    schedule 27.04.2019


Ответы (1)


person    schedule
comment
Пожалуйста, всегда помещайте свой ответ в контекст, а не просто вставляйте код. Подробнее см. здесь. - person gehbiszumeis; 27.11.2019