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