Генерация импульсного шум (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;
}
}
}