The image is of big size and I used getPixel and and setPixel methods to access bits but found out that it was way too slow so I went to implement lock and unlock bits but could not get my head around it. I also went through tutorials of Bob Powell but the tutorials but could not understand. So, I am asking for some help here to get GLCM from the image.

1

There are 1 answers

0
denver On

GLCM is generally a very computationally intensive algorithm. It iterates through each pixel, for each neighbor. Even C++ image processing libraries have this issue.

GLCM does however lend itself quite nicely to parallel (multi-threaded) implementations as the calculations for each reference pixel are independent.

With regards to using lock and unlock bits see the example code below. One thing to keep in mind is that the image can be padded for optimization reasons. Also, if your image has a different bit depth or multiple channels you will need to adjust the code accordingly.

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