如何在MATLAB

时间:2016-03-01 14:04:23

标签: matlab image-processing

我想在MATLAB中生成多重高斯图像。该图像包括三个圆圈。每个圆圈的强度遵循高斯分布。总的来说,图像的直方图将是多重的高斯分布,如预期的直方图

enter image description here

这是我的代码。但是,它没有达到我预期的直方图。你能帮我生成一个直方图如上图所示的图像

rows=256; columns=256;
grayImage=zeros(rows,columns);
t = linspace(0,2*pi,50);   % approximated by 100 lines
r = (rows-10)/2;              % circles will be separated by a 10 pixels border
circle1 = poly2mask(r*cos(t)+rows/2+0.5, r*sin(t)+columns/2+0.5, rows, columns);

r = (rows-10)/3;
circle2 = poly2mask(r*cos(t)+rows/2+0.5, r*sin(t)+columns/2+0.5, rows, columns);

r = (rows-10)/5;
circle3 = poly2mask(r*cos(t)+rows/2+0.5, r*sin(t)+columns/2+0.5, rows, columns);

grayImage(circle1) =30; 
grayImage(circle2) =100; 
grayImage(circle3) =130; 
im_normal=double(grayImage)./max(grayImage(:));
v = var(im_normal(:));
im_noise= imnoise(im_normal,'gaussian',0,v/20);
subplot(131);imshow(grayImage,[]); title('Free-noise image');
subplot(132);imshow(im_noise);title('Noisy image');
subplot(133);imhist(uint8(255.*im_noise)); title('Hist. of noisy mage');

这是我上面代码的图片。谢谢所有

enter image description here

1 个答案:

答案 0 :(得分:2)

首先,您的代码中存在一些错误。

从unit8转换为double时的第一个。你不需要除以最大值,但需要除以255,因为这是理论上的最大值,无论你是否在你的图像中都有它(否则,你为什么要稍后乘以255?!?)。

另外,我将这两个图像显示为uint8。改变后的代码就像:

rows=256; columns=256;
grayImage=zeros(rows,columns);
t = linspace(0,2*pi,50);   % approximated by 100 lines
r = (rows-10)/2;              % circles will be separated by a 10 pixels border
circle1 = poly2mask(r*cos(t)+rows/2+0.5, r*sin(t)+columns/2+0.5, rows, columns);

r = (rows-10)/3;
circle2 = poly2mask(r*cos(t)+rows/2+0.5, r*sin(t)+columns/2+0.5, rows, columns);

r = (rows-10)/5;
circle3 = poly2mask(r*cos(t)+rows/2+0.5, r*sin(t)+columns/2+0.5, rows, columns);

grayImage(circle1) =30; 
grayImage(circle2) =100; 
grayImage(circle3) =130; 
im_normal=double(grayImage)./255;
v = var(im_normal(:));
im_noise= imnoise(im_normal,'gaussian',0,v/20);
subplot(131);imshow(grayImage,[]); title('Free-noise image');
subplot(132);imshow(mat2gray(im_noise),[]);title('Noisy image');
subplot(133);imhist(uint8(255.*im_noise)); title('Hist. of noisy mage');

将图像表示为:

enter image description here

嗯,现在直方图看起来更相似了。但为什么不一样?

正在发生两件不同的事情。一个是真正的直方图以0-50之间的大量值开始,第二个是这个高斯大小不适合你的“客观”直方图中的大小。让我们一个接一个地解决它们。

第一个问题是有点像:你的图像不仅有3种颜色,还有黑色背景!因此,您的直方图将具有3高斯和大量黑色。如果你想删除它,你需要确保你的3个级别覆盖整个图像,不留下“黑色区域”。

第二个问题是这三个疙瘩的高斯,即高斯。要理解这一点,你需要知道这些高斯的振幅取决于这些“单色”斑点占据的面积。深灰色的像素量大于白色像素量,因此对应于该颜色的高斯分量更高。做一些简单的圆形区域计算,你应该能够计算你想要与其他圆形成比例的圆形区域,以便让高斯大小达到你想要的大小。