OpenCV C#中的图像转换

时间:2011-08-22 15:07:16

标签: c# opencv emgucv

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)));

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

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

2 个答案:

答案 0 :(得分:1)

好吧,你的代码在我尝试的时候有效,但是有其他选择。

本规范自然地提供了颜色* N&lt; 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>(); 

答案 1 :(得分:0)

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