我有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];
}
}
我该怎么办?
答案 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构造保存的数据类型,而不支持某些转换双倍,主要是因为这些存储的方式允许代码更有效地执行它们。这是一种很好的做法,但不是必须使用它。