Генерация импульсного шум (salt&pepper noise) - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, подскажите, пожалуйста, где можно получит подробную информацию о генерации импульсного шума на изображении. Желательно с элементами кода. В интернете мало информации, в основном все ограничивается странной формулой и все. Буду признательна. Заранее спасибо)

Решение задачи: «Генерация импульсного шум (salt&pepper noise)»

textual
Листинг программы
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            var img = Image.FromFile(@"p:\test.png");
 
            pictureBox1.Image = img;
            pictureBox2.Image = AddNoiseSlow(new Bitmap(img));
            pictureBox3.Image = AddNoiseFast(new Bitmap(img));
        }
 
        Bitmap AddNoiseSlow(Bitmap bmp, double size = 0.1, Random random = null)
        {
            var rnd = random ?? new Random();
            for (int i = (int)(size * bmp.Width * bmp.Height); i > 0; i--)
                bmp.SetPixel(
                    rnd.Next(bmp.Width), rnd.Next(bmp.Height),
                    rnd.NextDouble() < 0.5 ? Color.Black : Color.White);
            return bmp;
        }
 
        Bitmap AddNoiseFast(Bitmap bmp, double size = 0.1, Random random = null)
        {
            var rnd = random ?? new Random();
            var bdata = bmp.LockBits(
                new Rectangle(0, 0, bmp.Width, bmp.Height), 
                ImageLockMode.ReadWrite, bmp.PixelFormat);
            var psize = Image.GetPixelFormatSize(bmp.PixelFormat) / 8;
            var black = new byte[] { 0, 0, 0, 255 };
            var white = new byte[] { 255, 255, 255, 255 };
            for (int i = (int)(size * bmp.Width * bmp.Height); i > 0; i--)
            {
                int x = rnd.Next(bmp.Width);
                var y = rnd.Next(bmp.Height);
                var offset = bdata.Scan0 + y * bdata.Stride + x * psize;
                Marshal.Copy(rnd.NextDouble() < 0.5 ? white : black, 0, offset, psize);
            }
            bmp.UnlockBits(bdata);
            return bmp;
        }
    }
}

Оцени полезность:

5   голосов , оценка 4.2 из 5