Работа с изображениями в emgucv - PullRequest
1 голос
/ 15 августа 2011

У меня есть 2 изображения Emgu.CV.Image:

Image<Gray, byte> img1 = new Image<Gray, byte>(@"xyz.gif");
Image<Gray, byte> img2 = new Image<Gray, byte>(@"abc.gif");

Я хочу выполнить операцию с изображениями, например, добавление изображения попиксельно (без использования встроенных функций):

for (int i = 0; i < width1; i++){
    for (int j = 0; j < height1; j++){
        img2[i][j] = img1[i][j] + img2[i][j];
    }
}

Как я могу это сделать?

1 Ответ

0 голосов
/ 15 августа 2011

Если вам нужно изменить изображение Pixel by Pixel, вернитесь к использованию свойства Image.Data.

Если вы используете цветные изображения, важно отметить, что это трехмерный массив, содержащий данные Red, Green и Blue в слое 0,1,2 соответственно. Следующий код позволит вам получить доступ к данным с изображения и настроить его.

for (int i = 0; i < width1; i++)
{
    for (int j = 0; j < height1; j++)
    {
        img1.Data[i,j,0] = img1.Data[i,j,0] + img2.Data[i,j,0];
        img1.Data[i,j,1] = img1.Data[i,j,1] + img2.Data[i,j,1];
        img1.Data[i,j,2] = img1.Data[i,j,2] + img2.Data[i,j,2];
    }
}

При ошибке преобразования байтов int <> вам может потребоваться привести результаты к (байту) (однако вы можете назначить int для данных, предоставленных в диапазоне), т.е.

img1.Data[i,j,0] = (byte)img1.Data[i,j,0] + img2.Data[i,j,0];

это сделано для того, чтобы сообщить .Net, что вы готовы принять потерю данных. Обратите внимание, что вы добавляете два байта из данных изображения. Там значения 0-255, так что вы можете получить значение 0-510. Чтобы учесть это, вы должны нормализовать свои результаты к требуемому стандарту 0 - 255 в изображениях. т.е.

img1.Data[i,j,0] = ((img1.Data[i,j,0] + img2.Data[i,j,2])/0);

Поскольку вы используете изображения в оттенках серого, у данных изображения будет только 1 слой, код схож по формату, однако вы добавляете только первый слой 0.

for (int i = 0; i < width1; i++)
{
    for (int j = 0; j < height1; j++)
    {
        gray_image1.Data[i,j,0] = gray_image1.Data[i,j,0] + gray_image2.Data[i,j,0];
    }
}

Свойство TDepth позволяет вам изменять тип данных, хранящихся в конструкции .Data, в то время как некоторые преобразования не поддерживаются, имеют значение типа double, в основном потому, что способ их хранения позволяет более эффективно выполнять код с ними. Хорошей практикой является использование этого, однако это не очень важно.

...