确定包含在循环范围内的像素

时间:2019-02-22 14:33:24

标签: c#

该程序与中值过滤器一起使用。我需要有关修复代码的帮助。它适用于行

if ((diffX > -1) && (diffY > -1)...

...在MedianOfArea方法中。最好先确定包含在循环范围内的像素。该解决方案有助于避免每次检查。您能帮我解决它吗?

namespace Recognizer
{
    internal static class MedianFilterTask
    {
        public static double[,] MedianFilter(double[,] original)
        {
            var filter = new double[original.GetLength(0), original.GetLength(1)];
            var lengthX = original.GetLength(0);
            var lengthY = original.GetLength(1);
            for (var x = 0; x < lengthX; x++)
                for (var y = 0; y < lengthY; y++)
                    filter[x, y] = MedianOfArea(x, y, original, lengthX, lengthY);
            return filter;
        }

        public static double MedianCount(ref double median, List<double> pixelsFields)
        {
            pixelsFields.Sort();
            var countPixels = pixelsFields.Count;
            if (countPixels % 2 == 0)
                median = (pixelsFields[countPixels / 2 - 1] + pixelsFields[countPixels / 2]) / 2;
            else
                median = pixelsFields[countPixels / 2];
            return median;
        }

        public static double MedianOfArea(int x, int y, double[,] original, int lengthX, int lengthY)
        {
            var pixelsFields = new List<double>();
            double median = 0;
            for (int areasX = -1; areasX < 2; areasX++)
                for (int areasY = -1; areasY < 2; areasY++)
                {
                    var diffX = x + areasX;
                    var diffY = y + areasY;
                    if ((diffX > -1) && (diffY > -1) && (diffX < lengthX) && (diffY < lengthY))
                        pixelsFields.Add(original[diffX, diffY]);
                }
            MedianCount(ref median, pixelsFields);
            return median; 
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以直接在diffX(和diffY)上进行迭代,并使用MinMax设置要循环的范围:

using System; 

int startX = Math.Max(0, x-1);
int endX = Math.Min(lengthX, x+2);
int startY = Math.Max(0, y-1);
int endY = Math.Min(lengthY, y+2);
for (int diffX = startX; diffX < endX; diffX++)
    for (int diffY = startY; diffY < endY; diffY++)
        pixelsFields.Add(original[diffX, diffY]);