Эффективное редактирование пикселей в изображении - PullRequest
0 голосов
/ 02 марта 2011

У меня 8-битное изображение (хранится в массиве), содержащее черный (0) и белый (255) пиксели.Скажем, я хочу изменить все черные пиксели на изображении на серые (скажем, 120) пикселей.Какой самый быстрый способ я могу изменить черный на серый.

Я подумал о двух подходах -

  1. Начать проверку каждого пикселя в изображении,Как только черный пиксель найден, измените его на серый.Продолжить до конца изображения.(Медленнее, но легче)

  2. Начать проверку пикселей.Когда черный пиксель найден, ведите счетчик, чтобы отследить его.Продолжайте увеличивать счетчик до следующего белого пикселя.Затем перейдите к счетчику и используйте быструю функцию, такую ​​как memset, чтобы изменить группу черных пикселей на серый.(Не уверен, но я думаю, что это может быть быстрее)

У меня огромное изображение размером 1 ГБ, поэтому подход 1 довольно медленный.Есть ли лучший (более быстрый) способ изменения / редактирования пикселей?

Ответы [ 2 ]

6 голосов
/ 02 марта 2011

Вероятно, быстрее сделать это слово за один раз (с использованием выравнивания по слову).

Вы можете просто поразрядно ИЛИ с 0x78787878 (предполагая 32 бита).Это не повлияет на белые пиксели, но установит черные пиксели на требуемое значение.

1 голос
/ 02 марта 2011

Я думаю, что проблема с первым подходом заключается в том, что вы читаете и пишете одинаковые 32/64 / x биты (в зависимости от архитектуры памяти / ширины шины) несколько раз.Это должно быть быстрее, если вы читаете и записываете биты, соответствующие ширине шины, один раз.

В следующем фрагменте getPixelsSizeOfLong возвращает биты в соответствии с шириной шины (скажем, 4 байта) и уменьшаетпередача битов между кэшем и процессором.

// Forward declaration:
unsigned long getPixelsSizeOfLong(byteInImage unsigned int);
void          setPixelsSizeOfLong(byteInImage unsigned int, newBitValue unsigned long);

unsinged long l;

for (a=0; a+=sizeof(l); a<nof_pixels) {
  l  = getPixelsSizeOfLong(a);
  l |= 120;
  setPixelsSizeOfLong(a, l);
}
...