2014-07-05 31 views
0

我有興趣在現有圖像中添加單個高斯形狀對象,如附加圖像中的內容。我想添加對象的基本圖像是8位無符號值,範圍從0-255。附圖中的明亮對象實際上是一個由歸一化植被指數(NDVI)數據表示的樹。所附的腳本是我迄今爲止所擁有的。如何將一個高斯形狀的對象(即一棵樹)的值從110-155加到現有的NDVI圖像上?如何在圖像中添加高斯形狀的物體?

Sample data available here可與該腳本可以用來計算NDVI

enter image description here


file = 'F:\path\to\fourband\image.tif'; 
[I R] = geotiffread(file); 
outputdir = 'F:\path\to\output\directory\' 

%% Make NDVI calculations 
NIR = im2single(I(:,:,4)); 
red = im2single(I(:,:,1)); 
ndvi = (NIR - red) ./ (NIR + red); 
ndvi = double(ndvi); 

%% Stretch NDVI to 0-255 and convert to 8-bit unsigned integer 
ndvi = floor((ndvi + 1) * 128); % [-1 1] -> [0 256] 
ndvi(ndvi < 0) = 0;    % not really necessary, just in case & for symmetry 
ndvi(ndvi > 255) = 255;   % in case the original value was exactly 1 
ndvi = uint8(ndvi);    % change data type from double to uint8 

%% Need to add a random tree in the image here 


%% Write to geotiff 
tiffdata = geotiffinfo(file); 
outfilename = [outputdir 'ndvi_' '.tif']; 
geotiffwrite(outfilename, ndvi, R, 'GeoKeyDirectoryTag', tiffdata.GeoTIFFTags.GeoKeyDirectoryTag) 

回答

6

您的帖子被問如何做三件事情:

  1. 我們如何產生一個高斯形物體?
  2. 我們如何做到這一點,使得值在110-155之間?
  3. 我們如何將它放在我們的圖像?

讓我們分別回答每個問題,其中每個問題的順序建立在前面問題的知識基礎上。

我們如何生成一個高斯形狀的物體?

您可以使用fspecial從圖像處理工具箱生成高斯你:

mask = fspecial('gaussian', hsize, sigma); 

hsize指定你的高斯的大小。你沒有在你的問題中指定它,所以我假設你會想自己玩這個。這將產生一個hsize x hsize高斯矩陣。 sigma是你的高斯分佈的標準偏差。同樣,你也沒有指定這是什麼。 sigmahsize齊頭並進。參考我的previous post on how to determine sigma,將掩碼的標準偏差設置爲3-sigma規則通常是一個很好的規則。因此,一旦你設置hsize,就可以計算出sigma是:

sigma = (hsize-1)/6; 

因此,弄清楚什麼是hsize,然後計算出你sigma。之後,像上面那樣調用fspecial。通常是一個好主意,使hsize一個奇數整數。之所以會這樣,是因爲當我們最終將它放置在圖像中時,執行此操作的語法將允許您的蒙版對稱放置。當我們回到最後一個問題時,我會討論這個問題。

我們如何做到這一點,使得值在110-155之間?

我們可以通過調整mask中的值使得最小值爲110,最大值爲155。這可以這樣做:

%// Adjust so that values are between 0 and 1 
maskAdjust = (mask - min(mask(:)))/(max(mask(:)) - min(mask(:))); 

%//Scale by 45 so the range goes between 0 and 45 
%//Cast to uint8 to make this compatible for your image 
maskAdjust = uint8(45*maskAdjust); 

%// Add 110 to every value to range goes between 110 - 155 
maskAdjust = maskAdjust + 110; 

在一般情況下,如果你想你的高斯面罩內調整值,以使其從[a,b],你會在0和1之間的規範化,然後再去做:

maskAdjust = uint8((b-a)*maskAdjust) + a; 

您會注意到我們將此掩碼投射到uint8。我們這樣做的原因是爲了使蒙版兼容放置在圖像中。

我們如何將它放置在我們的圖像?

所有你需要做的是找出你想要放置高斯掩模的中心的行和列。我們假設這些變量存儲在rowcol中。因此,假設你要放置這ndvi,所有你需要做的是以下幾點:

hsizeHalf = floor(hsize/2); %// hsize being odd is important 
%// Place Gaussian shape in our image 
ndvi(row - hsizeHalf : row + hsizeHalf, col - hsizeHalf : col + hsizeHalf) = maskAdjust; 

爲什麼hsize應該是奇數的原因是爲了使圖像中的形狀的甚至安置。例如,如果掩模尺寸爲5×5,則對於ndvi上述語法簡化爲:

ndvi(row-2:row+2, col-2:col+2) = maskAdjust; 

從蔭罩中心,它延伸2行的上方和下方2行。列從2列向左延伸至2列。如果面具的尺寸是均勻的,那麼我們應該如何選擇掩模的模糊選擇。例如,如果掩碼大小爲4 x 4,我們應該選擇第二行還是第三行作爲中心軸?因此,爲了簡化事情,請確保您的面具的大小是奇數,或mod(hsize,2) == 1

這應該有希望和充分地回答你的問題。祝你好運!

+1

+1不錯的答案。下面是一些構建高斯濾波器的更多方法:http://stackoverflow.com/a/1835663/97160(注意它是一個[可分離濾波器](http://blogs.mathworks.com/steve/2006/10)/04/separable-convolution /),所以我們可以從1D中獲得2D濾鏡) – Amro

相關問題