在emgucv中操作图像

本文关键字:图像 操作 emgucv | 更新日期: 2023-09-27 18:05:30

我有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];
    }
}

我该怎么做?

在emgucv中操作图像

如果你需要改变图像,像素逐像素,然后它回到使用图像。数据属性。

如果你使用彩色图像,重要的是要注意它是一个三维数组,分别在第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<>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结构保存的数据类型,而一些转换不支持双精度,主要是因为这些存储方式允许代码更有效地执行它们。这是一个很好的做法,但不是必须的。