public void FilterMedian(Frame frame, Frame[] frames, int frameNumber, int radius, ColorModelEnum colorModel, ProcessTypeEnum processType) { var bitmapData = frame.BitmapData; var result = frame.Buffer; var buffers = frames.Select(item => item.Buffer).ToArray(); if (processType == ProcessTypeEnum.Parallelepiped) { Parallel.For(0, bitmapData.Height, row => { int byteIndex = row * bitmapData.Stride; for (int col = 0; col < bitmapData.Width; col++) { int pixelIndex = byteIndex + col * 3; var n = 0; double r1 = 0, g1 = 0, b1 = 0; for (int fi = 0; fi < frameNumber; fi++) { for (int i = -radius; i <= radius; i++) { var row2 = ColorModel.GetValue(row + i, 0, bitmapData.Height - 1) * bitmapData.Stride; for (int j = -radius; j <= radius; j++) { var col2 = ColorModel.GetValue(col + j, 0, bitmapData.Width - 1) * 3; r1 += 1f / buffers[fi][row2 + col2 + 2]; g1 += 1f / buffers[fi][row2 + col2 + 1]; b1 += 1f / buffers[fi][row2 + col2]; n++; } } } result[pixelIndex + 2] = (byte)ColorModel.GetValue((int)(n / r1), 0, 255); result[pixelIndex + 1] = (byte)ColorModel.GetValue((int)(n / g1), 0, 255); result[pixelIndex] = (byte)ColorModel.GetValue((int)(n / b1), 0, 255); } }); } else { Parallel.For(0, bitmapData.Height, row => { int byteIndex = row * bitmapData.Stride; for (int col = 0; col < bitmapData.Width; col++) { int pixelIndex = byteIndex + col * 3; var n = 0; double r1 = 0, g1 = 0, b1 = 0; for (int fi = 0; fi < frameNumber; fi++) { var r = radius - radius * (fi) / frameNumber; for (int i = -r; i <= r; i++) { var row2 = ColorModel.GetValue(row + i, 0, bitmapData.Height - 1) * bitmapData.Stride; for (int j = -r; j <= r; j++) { var col2 = ColorModel.GetValue(col + j, 0, bitmapData.Width - 1) * 3; r1 += 1f / buffers[fi][row2 + col2 + 2]; g1 += 1f / buffers[fi][row2 + col2 + 1]; b1 += 1f / buffers[fi][row2 + col2]; n++; } } } result[pixelIndex + 2] = (byte)ColorModel.GetValue((int)(n / r1), 0, 255); result[pixelIndex + 1] = (byte)ColorModel.GetValue((int)(n / g1), 0, 255); result[pixelIndex] = (byte)ColorModel.GetValue((int)(n / b1), 0, 255); } }); } }
private void ColorModelRadioButtonHandler(object sender, EventArgs e) { _colorModel = radioButtonColorModelRgb.Checked ? ColorModelEnum.Rgb : ColorModelEnum.Yuv; }
public void FilterLinearAverage(Frame frame, Frame[] frames, int frameNumber, int radius, ColorModelEnum colorModel, ProcessTypeEnum processType) { Console.Write("I'm HERE!"); if (colorModel == ColorModelEnum.Rgb) { FilterLinearAverageRgb(frame, frames, frameNumber, radius, processType); } else { FilterLinearAverageRgb(frame, frames, frameNumber, radius, processType); } }