OpenCV C# 中的图像转换

本文关键字:图像 转换 OpenCV | 更新日期: 2023-09-27 18:06:25

Image<bgr,byte> WeightedImg;
.
.
double color;
for (int i = 0; i < dataArray.Length; i++){
    color = dataArray[i, 2];
    WeightedImg.Bitmap.SetPixel(x, y,Color.FromArgb((int)Math.Ceiling(color * R), (int)Math.Ceiling(color * G),(int)Math.Ceiling(color * B)));
}

这一行:

WeightedImg.Bitmap.SetPixel(x, y,Color.FromArgb((int)Math.Ceiling(color * R),
   (int)Math.Ceiling(color * G),(int)Math.Ceiling(color * B)));

使程序崩溃..我想根据double值在WeightedImg中设置一个像素..这可能吗?

或者我可以从Image<bgr,byte>转换为Bitmapdouble[,]吗?

OpenCV C# 中的图像转换

好的,

当我尝试它时,您的代码可以正常工作,但是有其他选择。

此代码确实可以自然地工作,提供 color*N <255(产生不同的错误(:

Image<Bgr, byte> img = new Image<Bgr,byte>(10,10);

double color = 5;
double R = 20, B = 20, G = 20;
img.Bitmap.SetPixel(0,0,Color.FromArgb((int)Math.Ceiling(color * R),(int)Math.Ceiling(color * G), (int)Math.Ceiling(color * B)));

您可以尝试相同操作的另一种方法是直接分配值,如果没记错的话,数据属性是正确的是 [高度、宽度、深度] 格式,因此:

img.Data[y,x, 0] = (byte)Math.Ceiling(color * R); //Red
img.Data[y,x, 1] = (byte)Math.Ceiling(color * G); //Green
img.Data[y,x, 2] = (byte)Math.Ceiling(color * B); //Blue

或者更直接地,您可以使用:

img[0, 0] = new Bgr(Color.FromArgb((int)Math.Ceiling(color * R), (int)Math.Ceiling(color * G), (int)Math.Ceiling(color * B)));

所有这些方法都经过测试。

至于您的其他问题,是的,您可以将图像转换为位图

Bitmap x = img.ToBitmap();

如果不读取每个像素并将图像中的数据带到此数组,您就无法将数据显式转换为双精度 [,,](不是双精度 [,](,否则我不建议使用以下格式:

Image<Bgr,Double> img = new Image<Bgr,Double>(10,10); //or (filename) of course

和转换

Image<Bgr,Double> img_double = img.Convert<Bgr,Double>();

但请记住,您不能一次转换多个项目,不能直接转换为它必须这样做:

Image<Gray,Double> img_gray = img.Convert<Gray,Byte>().Convert<Gray,Double>(); 
//or alternatively    
Image<Gray,Double> img_gray = img.Convert<Bgr,Double>().Convert<Gray,Double>(); 

如果我不得不猜测,不知道异常,你是 Math.Ceiling 调用返回的值小于 0 或大于 255。也许在将它们发送到 Color.FromArgb 之前将值限制在该范围内。此外,请仔细检查 x 和 y 值是否实际在图像内。考虑到上面的代码,很难分辨。