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

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

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

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

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

textual
Листинг программы
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Imaging;
  4. using System.Windows.Forms;
  5. using System.Runtime.InteropServices;
  6.  
  7. namespace WindowsFormsApp1
  8. {
  9.     public partial class Form1 : Form
  10.     {
  11.         public Form1()
  12.         {
  13.             InitializeComponent();
  14.  
  15.             var img = Image.FromFile(@"p:\test.png");
  16.  
  17.             pictureBox1.Image = img;
  18.             pictureBox2.Image = AddNoiseSlow(new Bitmap(img));
  19.             pictureBox3.Image = AddNoiseFast(new Bitmap(img));
  20.         }
  21.  
  22.         Bitmap AddNoiseSlow(Bitmap bmp, double size = 0.1, Random random = null)
  23.         {
  24.             var rnd = random ?? new Random();
  25.             for (int i = (int)(size * bmp.Width * bmp.Height); i > 0; i--)
  26.                 bmp.SetPixel(
  27.                     rnd.Next(bmp.Width), rnd.Next(bmp.Height),
  28.                     rnd.NextDouble() < 0.5 ? Color.Black : Color.White);
  29.             return bmp;
  30.         }
  31.  
  32.         Bitmap AddNoiseFast(Bitmap bmp, double size = 0.1, Random random = null)
  33.         {
  34.             var rnd = random ?? new Random();
  35.             var bdata = bmp.LockBits(
  36.                 new Rectangle(0, 0, bmp.Width, bmp.Height),
  37.                 ImageLockMode.ReadWrite, bmp.PixelFormat);
  38.             var psize = Image.GetPixelFormatSize(bmp.PixelFormat) / 8;
  39.             var black = new byte[] { 0, 0, 0, 255 };
  40.             var white = new byte[] { 255, 255, 255, 255 };
  41.             for (int i = (int)(size * bmp.Width * bmp.Height); i > 0; i--)
  42.             {
  43.                 int x = rnd.Next(bmp.Width);
  44.                 var y = rnd.Next(bmp.Height);
  45.                 var offset = bdata.Scan0 + y * bdata.Stride + x * psize;
  46.                 Marshal.Copy(rnd.NextDouble() < 0.5 ? white : black, 0, offset, psize);
  47.             }
  48.             bmp.UnlockBits(bdata);
  49.             return bmp;
  50.         }
  51.     }
  52. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут