Быстрая обработка изображений - PullRequest
3 голосов
/ 21 мая 2011

У меня есть массив 10X10 со значениями от 1 до 10. Теперь скажите, что я хочу дать каждому значению уникальный цвет (скажем, 1 становится синим, 2 становится красным и т. Д.).Я использую qt qimage для представления изображения.Вот что я делаю

read array from disk. store in a[10][10]
generate a hash table in which each value in the array has a corresponding qRGB
for entire array
    get value (say a[0][0])
    search hashtable, get equivalent qRGB
    image.setPixel(coord,qRGB)

Это самый быстрый способ, которым я могу это сделать?У меня большое изображение, я сканирую каждый пиксель, ищу его значение в хэш-таблице, настройка пикселя идет немного медленнее.Есть ли более быстрый способ?

Ответы [ 2 ]

9 голосов
/ 24 мая 2011

Действительно, есть более быстрый способ: создать массив неподписанных символов и напрямую изменить значения пикселей.Затем создайте QImage из этого массива.Вызов setPixel () очень дорогой.

unsigned char* buffer_;
buffer_ = new unsigned char[4 * w * h];
//...


for(int i = 0; i < h; i++){
 for(int j = 0; j < w; j++){

  unsigned char r, g, b;
  //...

  buffer_[4 * (i * w + j)    ] = r;
  buffer_[4 * (i * w + j) + 1] = g;
  buffer_[4 * (i * w + j) + 2] = b;
 }
}

Это для QImage :: format_RGB32, и ваш paintEvent () будет выглядеть примерно так:

void paintEvent(QPaintEvent* event){
//...
QImage image(buffer_, w, h, QImage::Format_RGB32);
painter.drawImage(QPoint(0, 0), image);
}
4 голосов
/ 22 мая 2011

Если у вас есть только 10 разных цветов, вам не нужно использовать хэш-таблицу.Простого массива будет достаточно.Вам также не нужен массив a[10][10].Просто наберите image.setPixel, когда вы читаете его с диска.

Если у вас много разных цветов, храните их как значения RGB вместо индексов.Вы можете прочитать все данные одновременно и создать свое изображение с помощью QImage ( uchar * data, int width, int height, Format format ).Это будет намного быстрее, чем индивидуальная настройка каждого пикселя.

...