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);
                    }
                });
            }
        }
Exemple #2
0
 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);
     }
 }