最小过滤器功能不能代表正确的结果

时间:2018-12-21 10:13:33

标签: c# image-processing pgm

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

算法:http://www.roborealm.com/help/Min.phphttps://www.youtube.com/watch?v=Y_QF0Xq8zGM

调试示例:

我图片的开头:

PGM P2 Image

matrixSize = 3

offset = 1

第一次循环迭代:

j = 1, i = 1 neighboursNumbers = Count = 9

neighboursNumbers值:(请注意,这是在排序之前)

first iteration

第二循环迭代:

j = 1, i = 2 neighboursNumbers = Count = 9

neighboursNumbers值:(再次在排序之前)

second iteration

代码:

// 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;
    }
}

结果:

Output

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

Expected result

1 个答案:

答案 0 :(得分:2)

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

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

要修复此问题,只需创建一个新图像,然后在其中放置过滤器输出,而不修改过滤器输入。