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>
转换为Bitmap
或double[,]
吗?
好的,
当我尝试它时,您的代码可以正常工作,但是有其他选择。
此代码确实可以自然地工作,提供 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 值是否实际在图像内。考虑到上面的代码,很难分辨。