Цикл1. Идет последовательный перебор всех строк
В каждой строке последовательно берутся пиксели по 8 шт.
Для каждого пикселя считается серость и заноситься в массив (#Gray=0.2126*#24rrr + 0.7152*#24ggg + 0.0722*#24bbb). Массив сразу сортируется от самого светлого к самому темному.
Медину не нахожу, так как число цветов до 8, проще через if. Делим массив на два блока.
Для каждого блока считаем средневзвешенное значение: СуммаN(СеростьN*ЧислоПовтор овN) / ОбщееЧислоПовторов всех цветов
Для каждого блока определяем номер цвета в палитре 16, для чего находим ближайший цвет по серости.
Создаем массив, где каждого пикселя храниться два возможных цвета.
Цикл2. Распределяем ошибку.
Каждый пиксель приравниваться к ближайшему из двух рассчитанных цветов.
Считаться ошибка: #ERR.r=#24rrr-#24rrr1; #ERR.g=#24ggg-#24ggg1; #ERR.b=#24bbb-#24bbb1. Где 24xxx - исходный цвет пикселя, 24xxx1 - цвет к которому привели.
Распределяем ошибку:
вправо 7/16 ;
вниз-назад 3/16;
вниз 5/16;
вниз-вперед 1/16.
данные хранятся в массиве в виде строк BMP. Собственно это и вывожу на экран.
Цикл3. Перевод в GRF. Не реализован.
да, но цвета мы определяем по исходному изображению. Толку от контрастности если оба цвета получились одинаковыми?
Не приводил.
Есть подобный режим для 16 цветов, результат не очень, так как в ряде мест высвечиваются не главные цвета. Например: на небе. Но возможно тут заработает по другому, так как идет разброс ошибки.





Ответить с цитированием