我有一个 8bpp 1024 X 1024 大小的 PGM 格式图像,需要从中计算 GLCM(灰度共现矩阵)

本文关键字:1024 GLCM 计算 灰度 8bpp 有一个 图像 格式 PGM | 更新日期: 2023-09-27 18:34:40

图像很大,我使用getPixelsetPixel方法来访问位,但发现它太慢了,所以我去实现锁定和解锁位,但无法理解它。我也看了鲍勃鲍威尔的教程,但教程但无法理解。因此,我在这里寻求一些帮助,以从图像中获取GLCM。

我有一个 8bpp 1024 X 1024 大小的 PGM 格式图像,需要从中计算 GLCM(灰度共现矩阵)

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