【发布时间】:2011-12-08 15:16:47
【问题描述】:
如何使用 emgucv 向图像添加高斯噪声(具有特定的均值和方差)?
【问题讨论】:
如何使用 emgucv 向图像添加高斯噪声(具有特定的均值和方差)?
【问题讨论】:
我不太确定您作为高斯滤波器的要求是为了消除噪声。要使用自定义内核,您可以使用以下代码。如果您希望添加具有设定均值和方差的噪声,那么您可能不得不求助于循环通过 my_image.Data 属性并以这种方式添加它。下面是使用自定义内核的代码,如果它不是你之后告诉我的,我会尝试找到更合适的东西,示例图像的链接在这种情况下可能有用。
Image<Bgr, Byte> my_image = new Image<Bgr, byte>(open.FileName);
float[,] k = { {0, 0, 0},
{0, 0, -0},
{0.33F, 0, -0}};
ConvolutionKernelF kernel = new ConvolutionKernelF(k);
Image<Bgr, float> convolutedImage = my_image * kernel;
pictureBox1.Image = convolutedImage.ToBitmap();
我希望这会有所帮助,
克里斯
【讨论】:
Bitmap image = //your bitmap image
Image<Hsv, Byte> templateImageInHsv = new Image<Hsv, Byte>(image);
templateImageInHsv = templateImageInHsv.SmoothGaussian(3);
// Summary:
// Perform Gaussian Smoothing in the current image and return the result
//
// Parameters:
// kernelSize:
// The size of the Gaussian kernel (kernelSize x kernelSize)
//
// Returns:
// The smoothed image
public Image<TColor, TDepth> SmoothGaussian(int kernelSize);
【讨论】:
public static Image<Gray, byte> AddGaussianNoise(Image<Gray, byte> originalImage,int mean=0, int sigma=1)
{
var rnd = new Random();
var noiseGenerator = new GaussianRandom(rnd);
var noiseImage = new Image<Gray, float>(originalImage.Width, originalImage.Height);
var tempImage = new Image<Gray, float>(originalImage.Bitmap);
var noiseArray = Enumerable.Range(0, tempImage.Width * tempImage.Height).Select(o =>(float) noiseGenerator.NextGaussian(0, sigma)+mean).ToArray();
noiseArray = noiseArray.Select(o => o+mean ).ToArray();
var arrayAsBytes= GetByteArray(noiseArray);
noiseImage.Bytes = arrayAsBytes;
tempImage += noiseImage;
return tempImage.Convert<Gray, byte>();
}
对于 GaussianRandom 我使用的是https://stackoverflow.com/a/4594881
【讨论】: