2016-03-01 176 views
3

我想在MATLAB中生成多重高斯圖像。圖像包含三個圓圈。每個圓圈的強度遵循高斯分佈。完全,圖像的直方圖將是一個muliplicate高斯分佈直方圖預期如何在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

回答

2

首先,你有幾件事情錯在你的代碼。

當你從unit8轉換爲double時的第一個。你不需要按照最大值劃分,而是255,因爲這是理論上的最大值,不管你是否在圖像中都有它(否則,爲什麼你稍後會增加BU 255?!?!)。

此外,我將兩個圖像都顯示爲uint8。更改後的代碼loks,如:

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之間的值開始,第二個是這個高斯的大小不符合你的「客觀」直方圖。讓我們逐個解決它們。

第一個問題是一種ovbious:您的圖像不僅有3種顏色,但黑色背景!因此,你的直方圖將有3高斯和大量的黑色。如果你想刪除它,你需要確保你的3個關卡覆蓋整個圖像,不留下「黑色區域」。

第二個問題是這三個塊的高斯,高斯。要理解這一點,你需要知道這些高斯的幅度取決於這些「單色」斑點所佔據的面積。深灰色像素的數量比白色像素的數量大,因此與該顏色對應的高斯高。做一些簡單的圓圈面積計算,你應該能夠計算出你想要與其他圓圈成比例的圓的面積,以便讓gaussians達到你想要的大小。

+0

謝謝你的幫助。實際上,第一個問題是我沒有使用circle1對圖像進行多重處理(因爲我只考慮circle1內部的強度,因此如果我將它多重化,背景將變爲零)。作爲我的方法,是否可以製作高斯噪聲而不乘以高斯噪聲?這意味着強度仍然遵循高斯,但圖像不會嘈雜圖像 – Jame

+0

@ user8430是的,我想你可以,但它是非常模糊的。有無數的方法來做到這一點,你需要進一步限制問題 –

+0

我找到了方法/ matlab代碼來做到這一點。但我沒有找到。你能以某種方式向我建議或直接回答你的答案嗎?謝謝 – Jame