Итерация по блоку 2D Array за блоком в C ++ - PullRequest
7 голосов
/ 08 декабря 2011

Я работаю над домашним заданием для программы сжатия изображений на C ++.Моя картинка представлена ​​двумерным массивом пикселей;каждый пиксель является объектом с элементами «красный», «зеленый» и «синий».Чтобы решить эту проблему, я пытаюсь получить доступ к 2D-массиву по одному блоку за раз, а затем вызвать функцию, которая находит среднее значение RGB каждого блока и добавляет новый пиксель в меньший массив изображений.Размер каждого блока (или масштабный коэффициент) вводится пользователем.

В качестве примера представьте двумерный массив из 100 элементов, например myArray [10] [10].Если пользователь введет коэффициент сжатия 3, мне нужно будет разбить мини-2D-массивы размером 3 на 3. Мне не нужно учитывать переполнение, поэтому в этом примере я могу игнорировать последнюю строку и последний столбец.

2D Array

У меня написана большая часть программы, включая функцию поиска среднего цвета.Я не понимаю, как пройти 2D-массив.Я знаю, как последовательно циклически проходить 2D-массив (по одной строке за раз), но я не уверен, как получить маленькие квадраты в массиве.

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

Вот как вы проходите массив в C ++:

for(i=0; i < m; i++) {
  for(j=0; j < n; j++) {
    // do something with myArray[i][j] where i represents the row and j the column
  }
}

В качестве упражнения для читателя я оставлю вопрос о том, как проходить через массив различными способами.

3 голосов
/ 08 декабря 2011

Примерно так должно работать:

for(size_t bx = 0; bx < width;  bx += block_width)
for(size_t by = 0; by < height; by += block_height) {
  float sum = 0;
  for(size_t x = 0; x < block_width; ++x)
  for(size_t y = 0; y < block_height; ++y) {
    sum += array[bx + x][by + y];
  }
  average = sum / (block_width * block_height);
  new_array[bx][by] = average;
}

width - это полная ширина, block_width - длина ваших синих квадратов на диаграмме

0 голосов
/ 08 декабря 2011

вы можете использовать два вложенных цикла, один для x и один для y, и переместить начальную точку этих циклов по изображению. Так как это домашнее задание, я не буду выкладывать код, но вы сможете его решить.

...