/// <summary> /// Конструктор /// </summary> /// <param name="previous">Предишни блокове</param> /// <param name="current">Текущи блокове</param> public MotionMask(Blocks previous, Blocks current) { //Проверка дали двата блока са съвместими if (previous.Width != current.Width || previous.Height != current.Height) { throw new Exception("Blocks are not compatible"); } //Локализиране на блоковете byte[,,] p_data = previous.Data; byte[,,] c_data = current.Data; //Локализиране на размерите int width = current.Width; int height = current.Height; //Локализиране на компонентите int components = current.Components; //Създаване на масива за маската byte[,] mask = new byte[height, width]; //Създаване на самата маска for (int y = 1; y < height - 1; y++) { for (int x = 1; x < width - 1; x++) { //byte m1 = (byte)((p_data[y, x, 2] == c_data[y - 1, x - 1, 2]) ? 255 : 0); //byte m2 = (byte)((p_data[y, x, 2] == c_data[y - 1, x, 2]) ? 255 : 0); //byte m3 = (byte)((p_data[y, x, 2] == c_data[y - 1, x + 1, 2]) ? 255 : 0); byte m0 = (byte)Math.Abs(p_data[y, x, 2] - c_data[y, x, 2]); byte m1 = (byte)Math.Abs(p_data[y, x, 2] - c_data[y - 1, x - 1, 2]); byte m2 = (byte)Math.Abs(p_data[y, x, 2] - c_data[y - 1, x, 2]); byte m3 = (byte)Math.Abs(p_data[y, x, 2] - c_data[y - 1, x + 1, 2]); //byte m1 = (byte)(p_data[y, x, 2] / Math.Max(c_data[y - 1, x - 1, 2], (byte)1)); //byte m2 = (byte)(p_data[y, x, 2] / Math.Max(c_data[y - 1, x , 2], (byte)1)); //byte m3 = (byte)(p_data[y, x, 2] / Math.Max(c_data[y - 1, x + 1, 2], (byte)1)); //Вземане на трите варианта //byte m1 = (byte)(Math.Min(p_data[y, x, 2], c_data[y - 1, x - 1, 2]) / Math.Max(Math.Max(p_data[y, x, 2], c_data[y - 1, x - 1, 2]), (byte)1)); //byte m2 = (byte)(Math.Min(p_data[y, x, 2], c_data[y - 1, x, 2]) / Math.Max(Math.Max(p_data[y, x, 2], c_data[y - 1, x, 2]), (byte)1)); //byte m3 = (byte)(Math.Min(p_data[y, x, 2], c_data[y - 1, x + 1, 2]) / Math.Max(Math.Max(p_data[y, x, 2], c_data[y - 1, x + 1, 2]), (byte)1)); //Вземане на максималната валута mask[y, x] = (byte)((Math.Min(Math.Min(Math.Min(m0, m1), m2), m3) > 10) ? 255 : 0); } } //Задаване на размерите this.Width = width; this.Height = height; //Задаване на маската this.Data = mask; }
/// <summary> /// Конструктор /// </summary> /// <param name="blocks">Блокове</param> public ContrastMask(Blocks blocks) { //Локализиране на данните byte[, ,] data = blocks.Data; //Локализиране на размерите int width = blocks.Width; int height = blocks.Height; //Създаване на масива за маската byte[,] mask = new byte[height, width]; //Задаване на валута за средната стойност int average = 0; //Валута за текущия компонент byte cur; //Създаване на самата маска for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { cur = (byte)((double)((double)data[y, x, 0] / data[y, x, 1]) * 255); mask[y, x] = cur; average += cur; } } average /= (width * height); //Презадаване на валутите for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (mask[y, x] > average) mask[y, x] = 255; else mask[y, x] = 0; } } //Задаване на размерите this.Width = width; this.Height = height; //Задаване на маската this.Data = mask; }