图像很大,我使用getPixel
and 和setPixel
方法来访问位,但发现它太慢了,所以我去实现锁定和解锁位,但无法理解它。我也浏览了鲍勃鲍威尔的教程,但教程却看不懂。所以,我在这里寻求一些帮助以从图像中获取 GLCM。
问问题
621 次
1 回答
4
GLCM 通常是一种计算量非常大的算法。它为每个邻居迭代每个像素。甚至 C++ 图像处理库也有这个问题。
然而,GLCM 确实非常适合并行(多线程)实现,因为每个参考像素的计算都是独立的。
关于使用锁定和解锁位,请参见下面的示例代码。要记住的一件事是,出于优化原因,可以填充图像。此外,如果您的图像具有不同的位深度或多个通道,您将需要相应地调整代码。
BitmapData data = image.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadOnly, PixelFormat.Gray8);
byte* dataPtr = (byte*)data.Scan0;
int rowPadding = data.Stride - (image.Width);
// iterate over height (rows)
for (int i = 0; i < height; i++)
{
// iterate over width (columns)
for (int j = 0; j < width; j++)
{
// pixel value
int value = dataPtr[0];
// advance to next pixel
dataPtr++;
// at the end of each column, skip extra padding
if (rowPadding > 0)
{
dataPtr += rowPadding;
}
}
image.UnlockBits(data1);
于 2013-04-27T05:27:10.330 回答