我一直在使用C#编写边缘检测程序,并且最近使用了lock bits来加速它的运行。然而,lockBits仍然不够快。虽然问题可能出在我的算法上,但我也想知道是否有比lockBits更好的图像处理方法。
如果问题出在算法上,这里有一个简单的解释。遍历颜色数组(使用lockbits创建,代表像素),对于每个颜色,检查其周围的8个像素的颜色。如果这些像素与当前像素不够匹配,则将当前像素视为边缘。
以下是判断像素是否为边缘的基本代码。它接受一个包含9种颜色的Color[]数组,其中第一个颜色是要检查的像素。
如果问题出在算法上,这里有一个简单的解释。遍历颜色数组(使用lockbits创建,代表像素),对于每个颜色,检查其周围的8个像素的颜色。如果这些像素与当前像素不够匹配,则将当前像素视为边缘。
以下是判断像素是否为边缘的基本代码。它接受一个包含9种颜色的Color[]数组,其中第一个颜色是要检查的像素。
public Boolean isEdgeOptimized(Color[] colors)
{
//colors[0] should be the checking pixel
Boolean returnBool = true;
float percentage = percentageInt; //the percentage used is set
//equal to the global variable percentageInt
if (isMatching(colors[0], colors[1], percentage) &&
isMatching(colors[0], colors[2], percentage) &&
isMatching(colors[0], colors[3], percentage) &&
isMatching(colors[0], colors[4], percentage) &&
isMatching(colors[0], colors[5], percentage) &&
isMatching(colors[0], colors[6], percentage) &&
isMatching(colors[0], colors[7], percentage) &&
isMatching(colors[0], colors[8], percentage))
{
returnBool = false;
}
return returnBool;
}
这段代码适用于每个像素,使用lockbits获取颜色。
所以基本上问题是,如何让我的程序运行更快?是我的算法有问题,还是有比lockBits更快的方法?
顺便说一下,该项目在gitHub上,这里