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);
鲍勃·鲍威尔的教程在线吗?鲍勃·鲍威尔的教程在线吗?