Генерация импульсного шум (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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д