Помогите с алгоритмом 2D массива - PullRequest
2 голосов
/ 27 февраля 2011

Я работаю над программой, которая наилучшим образом комбинирует два изображения.Допустим, у меня есть два двумерных массива, содержащих «пиксельные» структуры, которые составляют эти два изображения.

Я уже написал алгоритм, который определяет где , чтобы объединить изображения относительно большего издва изображения в терминах «x» и «y», где x - столбец, а y - строка двумерного массива большего изображения.Точка, в которой они должны быть соединены, инкапсулирована в структуру «соответствия», которая выглядит следующим образом:

typedef struct {
    int overlap;       // used in algorithm to determine where to combine
    int x;             // column of larger image
    int y;             // row of larger image
    int overlapWidth;  // width of the overlap between the two images
    int overlapHeight; // height of the overlap between the two images
} match;

Обратите внимание, что точка сопоставления может быть отрицательной (x, y или оба) по отношению кувеличенное изображение.

Пиксели, содержащиеся в перекрытии, усредняются, и любые пиксели за пределами двух изображений (но все еще в новых измерениях) являются белыми.

Пример

 +---+---+ image1
 |   |   |
 +---+---+---+ image2
 |   | X |   |
 +---+---+---+
     |   |   |    
     +---+---+

X представляет точку совпадения для этих двух изображений, поэтому ее состояние выглядит следующим образом:

x = 1у = 1overlapWidth = 1overlapHeight = 1

Новое изображение для этого случая будет 3x3.

Предполагая, таким образом, что у меня есть «соответствие», в котором объединяются два изображения, вычисленная новая ширина иВысота результирующего изображения и выделенный 2D-массив для результирующего изображения на основе этих новых размеров. Мне интересно, как я могу поместить соответствующие пиксели в новое изображение.Ниже приведен некоторый псевдокод, который представляет то, что я пытаюсь сделать.

Псевдокод

FOREACH row in new_height
    FOREACH col in new_width
        IF larger_image AND smaller_image do not contain (row,col)
            add white pixel
        ELSE IF overlap contains (row,col)
            add average of pixels
        ELSE IF only larger_image contains (row,col)
            add larger_image pixel
        ELSE
            add smaller_image pixel

Мне трудно найти способ сделатьэтот.Я не обязательно ищу код, я просто ищу идеи о том, как я могу сделать то, о чем я говорю.Любые мысли будут оценены.

Ответы [ 2 ]

1 голос
/ 27 февраля 2011

Чтобы проверить, к какому изображению (ям) относится (row,col), вы можете использовать этот алгоритм.Мне нужно было иметь размеры больших и маленьких изображений;Таким образом, дополнительные параметры.

INPUT: row, col, match, big, small
if match.x < 0 then
    // offset of big image, in case small one is to the left
    offsetx <- -match.x
if match.y < 0 then
    // offset of big image, in case small one is above
    offsety <- -match.y
if offsetx <= col and col < offsetx + big.width then
    if offsety <= row and row < offsety + big.height then
        hitBig <- true
        coordBig <- (col - offsetx, row - offsety)
if offsetx + match.x <= col and col < offsetx + match.x + small.width then
    if offsety + match.y <= row and row < offsety + match.y + small.height then
        hitSmall <- true
        coordSmall <- (col - offsetx - match.x, row - offsety - match.y)
return hitBig, coordBig, hitSmall, coordSmall

Все координаты относительно нового изображения.Если маленькое изображение находится сверху и слева, на новом изображении оно будет иметь значение (0,0), а большое изображение будет перемещено вниз и вправо.

1 голос
/ 27 февраля 2011

Ваш псевдокод выглядит правильно.Вы просто не можете перевести его на C?

Во-первых, ваш псевдокод использует слово «add», которое подразумевает, что пиксель помещается в какой-то новый массив, но не указывает, откуда этот массив берется,Итак, позвольте мне немного расширить ваш псевдокод:

Create a new_image
FOREACH row in new_height
    FOREACH col in new_width
        IF larger_image AND smaller_image do not contain (row,col)
            in new_image, set (row,col) to white pixel
        ELSE IF overlap contains (row,col)
            in new_image, set (row,col) to average of pixels
        ELSE IF only larger_image contains (row,col)
            in new_image, set (row,col) to larger_image pixel
        ELSE
            in new_image, set (row,col) to smaller_image pixel

Теперь проблема в том, что «не содержать (строка, столбец)».Что означает, что изображение не содержит определенной координаты?Это означает, что координата (row, col) находится за пределами пространства исходного изображения.Я думаю, что было бы полезно, если бы вы написали функцию, которая берет изображение (большое или маленькое) и структуру match, а также (row, col) координаты в новом пространстве изображений и возвращает либо соответствующий пиксель изИсходное изображение, или указывает, что пиксель не находится в этом изображении.(В C вы можете сделать это с помощью функции, возвращающей int, 1, если там есть пиксель, и 0, если его нет, и иметь аргумент, который является указателем на пиксель, который вы заполняете, если возвращаете1.)

Теперь вы можете спросить эту функцию, содержат ли large_image и small_image (row, col), а также получить пиксель от каждого, если они есть, и применить ваши четыре различных случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...