最小过滤函数不代表正确的结果
Minimum Filter function doesn't represent the right result
我制作了一个适用于 PGM P2 图像的最小滤镜功能。问题是输出错误。一切都在下面描述。
算法:http://www.roborealm.com/help/Min.php and https://www.youtube.com/watch?v=Y_QF0Xq8zGM
调试示例:
我图片的开头部分:
matrixSize = 3
offset = 1
第一次循环迭代:
j = 1, i = 1
neighboursNumbers = Count = 9
neighboursNumbers
值:(注意这是排序前)
第二次循环迭代:
j = 1, i = 2
neighboursNumbers = Count = 9
neighboursNumbers
值:(再次排序前)
代码:
// 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;
}
}
结果:
预期(此结果在 ImageJ 中使用半径 7.0):
您正在用过滤器的输出替换循环中源图像 Pixels
的数据。您不应该这样做,因为滤镜必须应用于整个源图像。
要查看问题,请假设您将滤镜应用于像素 (X,Y)
并获得 M
的输出。算法的下一步是将过滤器应用于 (X+1,Y)
。该像素的邻域包括 (X,Y)
,但您在前面的步骤中将其值替换为 M
。因此,局部最小值将持续存在,直到找到新的最小值。这会创建结果图像的结构。
要修复它,只需创建一个新图像,在其中放置过滤器输出,不要修改过滤器输入。
我制作了一个适用于 PGM P2 图像的最小滤镜功能。问题是输出错误。一切都在下面描述。
算法:http://www.roborealm.com/help/Min.php and https://www.youtube.com/watch?v=Y_QF0Xq8zGM
调试示例:
我图片的开头部分:
matrixSize = 3
offset = 1
第一次循环迭代:
j = 1, i = 1
neighboursNumbers = Count = 9
neighboursNumbers
值:(注意这是排序前)
第二次循环迭代:
j = 1, i = 2
neighboursNumbers = Count = 9
neighboursNumbers
值:(再次排序前)
代码:
// 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;
}
}
结果:
预期(此结果在 ImageJ 中使用半径 7.0):
您正在用过滤器的输出替换循环中源图像 Pixels
的数据。您不应该这样做,因为滤镜必须应用于整个源图像。
要查看问题,请假设您将滤镜应用于像素 (X,Y)
并获得 M
的输出。算法的下一步是将过滤器应用于 (X+1,Y)
。该像素的邻域包括 (X,Y)
,但您在前面的步骤中将其值替换为 M
。因此,局部最小值将持续存在,直到找到新的最小值。这会创建结果图像的结构。
要修复它,只需创建一个新图像,在其中放置过滤器输出,不要修改过滤器输入。