Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 加速转换法_C#_Image Processing - Fatal编程技术网

C# 加速转换法

C# 加速转换法,c#,image-processing,C#,Image Processing,这个方法中的b.GetPixel调用非常慢,有没有办法用锁位之类的东西来加速这个方法?但我不知道如何使用指针来获得像素值等 背景:我需要float[][],因为我提出了加权随机化的问题 public static float[][] ConvertToGrayScale(this Bitmap bm) { var b = new Bitmap(bm); var data = new List<float[]>(); for (var i = 0; i <

这个方法中的
b.GetPixel
调用非常慢,有没有办法用锁位之类的东西来加速这个方法?但我不知道如何使用指针来获得像素值等

背景:我需要
float[][]
,因为我提出了加权随机化的问题

public static float[][] ConvertToGrayScale(this Bitmap bm)
{
    var b = new Bitmap(bm);
    var data = new List<float[]>();
    for (var i = 0; i < b.Width; i++)
    {
        var row = new List<float>();
        for (int x = 0; x < b.Height; x++)
        {
            var oc = b.GetPixel(i, x);
            var grayScale = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
            row.Add(grayScale);
        }
        data.Add(row.ToArray());
    }
    return data.ToArray();
}
现在代码已优化:


为什么不先创建阵列,而不使用中间列表?您提前知道尺寸,因此可以节省为位图的每一行创建列表的时间。这是我发现的第一个明显的胜利。

在尝试不安全代码之前,您可以对当前代码进行一些优化:

public static float[,] ConvertToGrayScale2(this Bitmap bm)
{
    var data = new float[bm.Width, bm.Height];
    for (var i = 0; i < bm.Width; i++)
    {
        for (int x = 0; x < bm.Height; x++)
        {
            var oc = bm.GetPixel(i, x);
                            // casting to int here - you can just use a 2d array of ints
            data[i, x] = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
        }
    }
    return data;
}
publicstaticfloat[,]ConvertToGrayScale2(此位图bm)
{
var数据=新浮动[bm.宽度,bm.高度];
对于(变量i=0;i
优化:

  • 无需创建新位图即可使用。引用你传递的那个
  • 使用浮点数的矩形数组,而不是常规列表
  • 这将消除许多额外的分配和一些集合创建/管理开销
  • 请带上一点盐,不要用IDE

通过将二维阵列展平为一维阵列,您可以进一步优化代码。另外,如果一次调用数组就可以从位图中获取所有像素数据(我个人没有使用过),那么将其并行化应该是非常容易的。@JaakkoLipsanen:+1这两个点都很好。第二个是可以通过锁定位实现的:您需要支持哪些像素格式?格式化24BPPRGB和格式化32BPPRGB?
 public static GrayScaleResult ConvertToGrayScale(this Bitmap b)
 {
     var bm = new Bitmap(b);
     var result = new GrayScaleResult(bm);
     ...
public static float[,] ConvertToGrayScale2(this Bitmap bm)
{
    var data = new float[bm.Width, bm.Height];
    for (var i = 0; i < bm.Width; i++)
    {
        for (int x = 0; x < bm.Height; x++)
        {
            var oc = bm.GetPixel(i, x);
                            // casting to int here - you can just use a 2d array of ints
            data[i, x] = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
        }
    }
    return data;
}