Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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# 最小筛选函数不代表正确的结果_C#_Image Processing_Pgm - Fatal编程技术网

C# 最小筛选函数不代表正确的结果

C# 最小筛选函数不代表正确的结果,c#,image-processing,pgm,C#,Image Processing,Pgm,我做了一个最小的过滤器功能,应该适用于PGM P2图像。问题是输出错误。一切都在下面描述 算法:和 调试示例: 我的图像的开始部分: 矩阵大小=3 偏移量=1 第一次循环迭代: j=1,i=1 邻居数量=计数=9 NeighboursNumber值:请注意,这是在排序之前 第二次循环迭代: j=1,i=2 邻居数量=计数=9 邻接数字值:再次在排序之前 代码: 结果: 预期此结果在ImageJ中使用半径7.0: 您正在使用过滤器的输出替换循环中源图像像素的数据。您不应该这样做,因为过滤器必须应用

我做了一个最小的过滤器功能,应该适用于PGM P2图像。问题是输出错误。一切都在下面描述

算法:和

调试示例:

我的图像的开始部分:

矩阵大小=3

偏移量=1

第一次循环迭代:

j=1,i=1 邻居数量=计数=9

NeighboursNumber值:请注意,这是在排序之前

第二次循环迭代:

j=1,i=2 邻居数量=计数=9

邻接数字值:再次在排序之前

代码:

结果:

预期此结果在ImageJ中使用半径7.0:


您正在使用过滤器的输出替换循环中源图像像素的数据。您不应该这样做,因为过滤器必须应用于整个源图像

若要查看问题,请假设您将过滤器应用于像素X,Y,并获得M的输出。算法的下一步是将过滤器应用于X+1,Y。该像素的邻域包括X,Y,但您在前一步中将其值替换为M。因此,局部最小值将持续存在,直到找到新的最小值。这将创建结果图像的结构


为了修复它,只需创建一个新图像,在其中放置过滤器输出,而不修改过滤器输入。

应选择image.Pixels[y*Width+x].ToList;实际上是选择image.Pixels[y*image.Width+x].ToList;?没错。我在这里手动输入,因为我使用的是一个函数。谢谢,它解决了这个问题!有一个小的黑色边框,因为如果matrixSize为3,则该算法不处理第一个i,j行/列。我没有创建一个空数组,而是从真实数组中克隆了它,你认为有比这个更好的解决方案吗?int[]temp=int[]image.Pixels.Clone;
// Properties
public string Format { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public int MaxGrayLevel { get; set; }
public int[] Pixels { get; set; }

// Minimum Filter Code
int matrixSize = 3;

int offset = (matrixSize - 1) / 2;

for (int j = offset; j < image.Height - offset; j++)
{
    for (int i = offset; i < image.Width - offset; i++)
    {
        List<int> neighboursNumbers = (from x in Enumerable.Range(i - offset, matrixSize)
                                       from y in Enumerable.Range(j - offset, matrixSize)
                                       where (x >= 0) && (x < image.Width) && (y >= 0) && (y < image.Height)
                                       select image.Pixels[y * Width + x]).ToList();

        neighboursNumbers.Sort();

        int minIndex = neighboursNumbers[0];
        image.Pixels[j * image.Width + i] = minIndex;
    }
}