Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.200.143] |
|
Сообщ.
#1
,
|
|
|
Привет всем.
Реализовываю данный алгоритм на микроконтроллере, поэтому интересует голый алгоритм, без каких-либо библиотек, модулей, плагинов и родственных тому вещей. За основу взял вот это описание - http://www.intuit.ru/studies/courses/993/1...ure/4511?page=3 Получилось вот такое: // Читаем 1-ю строку картинки SSTF016B_ReadBuffer ( source_addr, pLine1, width ); source_addr += width; // Читаем 2-ю строку картинки SSTF016B_ReadBuffer ( source_addr, pLine2, width ); source_addr += width; for ( y = 0; y < height; y ++ ) { // цикл по строкам изображения for ( x = 0; x < width; x ++ ) { // цикл по столбцам oldpixel = pLine1 [ x ]; if ( oldpixel > 150 ) { newpixel = 255; quant_error = oldpixel - 255; } // if else { newpixel = 0; quant_error = oldpixel; // quant_error = 0; } // else // Запись полученного пикселя SSTF016B_WriteByte ( dest_addr ++, newpixel ); // Коррекция pLine1 [x+1] += ( ( 7 * quant_error) >> 4 ); // 1 - я коррекция if ( x >= 1 ) pLine2 [ x-1 ] += ( ( 3 * quant_error ) >> 4 ); // 2 - я коррекция pLine2 [ x ] += ( ( 5 * quant_error ) >> 4 ); // 3 - я коррекция pLine2 [ x + 1 ] += ( quant_error >> 4 ); // 4 - я коррекция } // for // Подготовка к обработке след строки // Перенос 2-го буфера в первый memcpy ( pLine1, pLine2, width ); // Чтение следующей строки SSTF016B_ReadBuffer ( source_addr, pLine2, width ); source_addr += width; } // for Из-за ограниченности ресурсов контроллера в памяти единовременно держу только 2 строки изображения. Исходное изображение - серое, файл angel-grey658_665.bmp. Считывается он абсолютно нормально, проверено выводом на дисплей устройства. Результат - angel_out.bmp. То, что он перевернут вдоль вертикальной оси - не проблема, это следствие переворота его на компьютере, железка сохраняет его в перевёрнутом виде. Смущают чёрные пятна внизу и белое пятно слева. Если в ветке else сделать так: // quant_error = oldpixel; quant_error = 0; Такой вариант тоже встречается на просторах интернета. При этом получаем angel_out.bmp. Низ получился нормальный, но вот белые пятна слева увеличились. Почему - непонятно. Кто-то может помочь? bmp положил в архивах, т.к. форум блокирует .bmp Спасибо. Прикреплённый файлangel_grey658_665.zip (232,71 Кбайт, скачиваний: 131) Прикреплённый файлangel_out.zip (34,25 Кбайт, скачиваний: 124) Прикреплённый файлangel_out_1.zip (50,12 Кбайт, скачиваний: 126) |
Сообщ.
#2
,
|
|
|
Нужно учитывать переполнение при распределении ошибки, т.е. все значения <0 и >255 должны быть приведены к 0 и 255.
|
Сообщ.
#3
,
|
|
|
Да, спасибо большое, помогло. Блин, хрен поймёшь, как правильно реализовывать эти теоретические алгоритмы.
Погоняю ещё на других картинках, отпишусь. |
Сообщ.
#4
,
|
|
|
Цитата x128 @ Или надо вычисления вести в расширенном диапазоне. Хотя в обоих случаях иногда свои артефакты появляются. Нужно учитывать переполнение при распределении ошибки, т.е. все значения <0 и >255 должны быть приведены к 0 и 255. |
Сообщ.
#5
,
|
|
|
Цитата x128 @ Нужно учитывать переполнение при распределении ошибки, т.е. все значения <0 и >255 должны быть приведены к 0 и 255. И всё это отрезанное (вышедшее за диапазон) при желании можно прибавлять к нераспределённой ошибке и переносить в соседние пикселы. |
Сообщ.
#6
,
|
|
|
Заработало, результат хороший.
Спасибо всем откликнувшимся. |