На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Алгоритм Флойда-Стенберга , Странная работа, помогите пожалуйста
    Привет всем.
    Реализовываю данный алгоритм на микроконтроллере, поэтому интересует голый алгоритм, без каких-либо библиотек, модулей, плагинов и родственных тому вещей.

    За основу взял вот это описание - http://www.intuit.ru/studies/courses/993/1...ure/4511?page=3
    Получилось вот такое:

    ExpandedWrap disabled
          // Читаем 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)
      Нужно учитывать переполнение при распределении ошибки, т.е. все значения <0 и >255 должны быть приведены к 0 и 255.
        Да, спасибо большое, помогло. Блин, хрен поймёшь, как правильно реализовывать эти теоретические алгоритмы.
        Погоняю ещё на других картинках, отпишусь.
          Цитата x128 @
          Нужно учитывать переполнение при распределении ошибки, т.е. все значения <0 и >255 должны быть приведены к 0 и 255.
          Или надо вычисления вести в расширенном диапазоне. Хотя в обоих случаях иногда свои артефакты появляются.
            Цитата x128 @
            Нужно учитывать переполнение при распределении ошибки, т.е. все значения <0 и >255 должны быть приведены к 0 и 255.

            И всё это отрезанное (вышедшее за диапазон) при желании можно прибавлять к нераспределённой ошибке и переносить в соседние пикселы.
              Заработало, результат хороший.


              Спасибо всем откликнувшимся.
              Сообщение отредактировано: hd44780 -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0235 ]   [ 17 queries used ]   [ Generated: 5.05.24, 03:03 GMT ]