在emgucv中运行图像

时间:2011-08-15 09:01:19

标签: c# emgucv

我有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 :(得分:0)

如果您需要更改图像Pixel by Pixel,那么它将返回使用Image.Data属性。

如果您正在使用彩色图像,请务必注意它是一个3维数组,分别包含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&lt;&gt; Byte转换错误,您可能需要将结果转换为(byte)(但是您可以将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构造保存的数据类型,而不支持某些转换双倍,主要是因为这些存储的方式允许代码更有效地执行它们。这是一种很好的做法,但不是必须使用它。