如何将高斯形状的对象添加到图像?

时间:2014-07-05 18:05:13

标签: image matlab image-processing

我有兴趣在现有图像中添加单个高斯形状的对象,如附图中所示。我想要添加对象的基本图像是8位无符号,值为0-255。附着图像中的明亮物体实际上是由归一化差异植被指数(NDVI)数据表示的树。附件脚本是我到目前为止所拥有的。如何添加一个高斯形状的abject(即树),其值范围从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) 

1 个答案:

答案 0 :(得分:6)

您的帖子询问如何做三件事:

  1. 我们如何生成高斯形状的物体?
  2. 我们如何做到这一点,以使值介于110 - 155?
  3. 之间
  4. 我们如何将其置于图片中?
  5. 让我们分别回答每个问题,每个问题的顺序都建立在之前问题的基础上。

    我们如何生成高斯形状的对象?

    您可以使用图像处理工具箱中的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 x 5,则ndvi的上述语法简化为:

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

    从面具的中心,它在上面2行和下面2行延伸。列从左侧的2列延伸到右侧的2列。如果面罩尺寸是均匀的,那么我们就如何放置面罩会有一个模糊的选择。如果掩模尺寸为4 x 4,我们应该选择第二行还是第三行作为中心轴?因此,为了简化操作,请确保蒙版的大小为奇数,或mod(hsize,2) == 1

    这应该有希望并充分回答您的问题。祝你好运!