matlab - 如何在 MATLAB 中生成多重二维高斯图像分布

标签 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

最佳答案

首先,您的代码中有几处错误。

从 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 个级别覆盖整个图像,不留下任何“黑色区域”。

第二个问题是这三个 block 的大小,即高斯分布。要理解这一点,您需要注意这些高斯分布的幅度取决于这些“单色” Blob 所占的面积。深灰色的像素数量远大于白色的像素数量,因此对应于该颜色的高斯更高。进行一些简单的圆面积计算,您应该能够计算出您想要与其他圆成比例的圆的面积,以便获得您想要的大小的高斯。

关于matlab - 如何在 MATLAB 中生成多重二维高斯图像分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35725040/

相关文章:

matlab - matlab中的SPM : how to call matlab function in Batch Editor

matlab - 使用 Matlab 进行优化

Codeigniter 不保持纵横比

python - 如何在 Python 中快速定位屏幕上的内容?

algorithm - cv::undistortPoints() - 迭代算法解释

c++ - 仅在调试期间在 C++ 中初始化 matlab 编译器 dll/lib 时发生访问冲突

matlab - 指定间隔宽度的条形图条

android - Android 中的颜色替换器

java - 如何在单元格选择过程中同时设置单元格背景和小数格式

matlab - 如何从黑白图片中提取车牌