我想在 MATLAB 中生成多重高斯图像。该图像包括三个圆圈。每个圆圈中的强度服从高斯分布。总的来说,图像的直方图将是预期的直方图的多重高斯分布
这是我的代码。但是,它没有达到我预期的直方图。你能帮我生成一个具有上图直方图的图像吗
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');
这是我上面代码的图像。谢谢大家
最佳答案
首先,您的代码中有几处错误。
从 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');
给出图像为:
好吧,现在直方图看起来更相似了。但是为什么不一样呢??
有两种不同的情况正在发生。一个是真实的直方图以 0-50 之间的许多值开始,第二个是这个高斯的大小不适合你的“目标”直方图中的那些。让我们一一解决。
第一个问题有点难看:你的图像不仅有 3 种颜色,还有黑色背景!因此,您的直方图将具有 3 个高斯分布和大量黑色。如果你想删除它,你需要确保你的 3 个级别覆盖整个图像,不留下任何“黑色区域”。
第二个问题是这三个 block 的大小,即高斯分布。要理解这一点,您需要注意这些高斯分布的幅度取决于这些“单色” Blob 所占的面积。深灰色的像素数量远大于白色的像素数量,因此对应于该颜色的高斯更高。进行一些简单的圆面积计算,您应该能够计算出您想要与其他圆成比例的圆的面积,以便获得您想要的大小的高斯。
关于matlab - 如何在 MATLAB 中生成多重二维高斯图像分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35725040/