我正在尝试创建一种方法,该方法将过滤掉给定灰度阈值以下的所有像素(例如,下面的都是黑色,上面的都是白色)。该方法有效,但没有我认为的那么快。
我决定使用该Parallel
课程,但无论我设置什么,MaxDegreeOfParallelism
我都没有获得任何速度优势。我也在位图上执行了一些其他操作,并且操作的总时间,不管是什么MaxDegreeOfParallelism
,总是在 170 毫秒左右。调试时,执行此过滤本身所需的时间大约需要 160 毫秒,所以我认为会有明显的整体差异。
我使用的是 i7 处理器,4 个物理内核,8 个逻辑内核。
编码:
Color black = System.Drawing.Color.FromArgb(0, 0, 0);
Color white = System.Drawing.Color.FromArgb(255, 255, 255);
int lowerBound = (int)((float)lowerBoundPercent * 255.0 / 100.0);
int upperBound = (int)((float)upperBoundPercent * 255.0 / 100.0);
int[][] border = new int[8][];
for (int i=0;i<8;i++)
{
border[i] = new int[] { i*height/8, (i+1)*height/8-1};
}
Parallel.For(0, 8, new ParallelOptions { MaxDegreeOfParallelism = 8 }, i =>
{
for (int k = 0; k < width; k++)
{
for (int j = border[i][0]; j <= border[i][1]; j++)
{
Color pixelColor;
int grayscaleValue;
pixelColor = color[k][j];
grayscaleValue = (pixelColor.R + pixelColor.G + pixelColor.B) / 3;
if (grayscaleValue >= lowerBound && grayscaleValue <= upperBound)
color[k][j] = white;
else
color[k][j] = black;
}
}
});
color[][]
是一个锯齿状数组System.Drawing.Color
。
问题:这正常吗?如果没有,我该怎么做才能改变它?
编辑:
像素提取:
Color[][] color;
color = new Color[bitmap.Width][];
for (int i = 0; i < bitmap.Width; i++)
{
color[i] = new Color[bitmap.Height];
for (int j = 0; j < bitmap.Height; j++)
{
color[i][j] = bitmap.GetOriginalPixel(i, j);
}
}
Bitmap 是我自己的类 Bitmap 的一个实例:
public class Bitmap
{
System.Drawing.Bitmap processed;
//...
public Color GetOriginalPixel(int x, int y) { return processed.GetPixel(x, y); }
//...
}