Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我有一张8bp1024x1024大小的PGM格式图像,需要从中计算GLCM(灰度共生矩阵)_C#_Image_Image Processing_Glcm - Fatal编程技术网

C# 我有一张8bp1024x1024大小的PGM格式图像,需要从中计算GLCM(灰度共生矩阵)

C# 我有一张8bp1024x1024大小的PGM格式图像,需要从中计算GLCM(灰度共生矩阵),c#,image,image-processing,glcm,C#,Image,Image Processing,Glcm,图像很大,我使用了getPixel和setPixel方法来访问位,但发现速度太慢了,所以我去实现锁定和解锁位,但无法控制它。我也看了鲍伯·鲍威尔的教程,但是这些教程我不懂。因此,我在这里请求一些帮助,以便从图像中获取GLCM。GLCM通常是一种计算量非常大的算法。对于每个邻居,它迭代每个像素。甚至C++图像处理库也有这个问题。 然而,GLCM非常适合并行(多线程)实现,因为每个参考像素的计算是独立的 关于使用锁定和解锁位,请参见下面的示例代码。需要记住的一点是,出于优化的原因,可以对图像进行填充

图像很大,我使用了
getPixel
setPixel
方法来访问位,但发现速度太慢了,所以我去实现锁定和解锁位,但无法控制它。我也看了鲍伯·鲍威尔的教程,但是这些教程我不懂。因此,我在这里请求一些帮助,以便从图像中获取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);
BitmapData data=image.LockBits(新矩形(0,0,宽度,高度),
ImageLockMode.ReadOnly,PixelFormat.Gray8);
字节*dataPtr=(字节*)data.Scan0;
int rowPadding=data.Stride-(image.Width);
//迭代高度(行)
对于(int i=0;i0)
{
dataPtr+=行填充;
}
}
图像。解锁位(数据1);

>P>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);
BitmapData data=image.LockBits(新矩形(0,0,宽度,高度),
ImageLockMode.ReadOnly,PixelFormat.Gray8);
字节*dataPtr=(字节*)data.Scan0;
int rowPadding=data.Stride-(image.Width);
//迭代高度(行)
对于(int i=0;i0)
{
dataPtr+=行填充;
}
}
图像。解锁位(数据1);

鲍勃·鲍威尔的教程在线吗?鲍勃·鲍威尔的教程在线吗?