我有兴趣在现有图像中添加单个高斯形状的对象,如附图中所示。我想要添加对象的基本图像是8位无符号,值为0-255。附着图像中的明亮物体实际上是由归一化差异植被指数(NDVI)数据表示的树。附件脚本是我到目前为止所拥有的。如何添加一个高斯形状的abject(即树),其值范围从110-155到现有的NDVI图像?
Sample data available here可以与此脚本一起使用来计算NDVI
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)
答案 0 :(得分:6)
您的帖子询问如何做三件事:
让我们分别回答每个问题,每个问题的顺序都建立在之前问题的基础上。
您可以使用图像处理工具箱中的fspecial
为您生成高斯:
mask = fspecial('gaussian', hsize, sigma);
hsize
指定高斯的大小。你没有在你的问题中指明它,所以我假设你想要自己玩这个。这将产生hsize x hsize
高斯矩阵。 sigma
是高斯分布的标准偏差。同样,你还没有具体说明这是什么。 sigma
和hsize
齐头并进。参考我的previous post on how to determine sigma
,将掩码的标准偏差设置为 3-sigma 规则通常是一个很好的规则。因此,在设置hsize
后,您可以将sigma
计算为:
sigma = (hsize-1) / 6;
因此,找出hsize
是什么,然后计算您的sigma
。之后,像我上面那样调用fspecial
。将hsize
设为奇数整数通常是一个好主意。原因是因为当我们最终将它放在您的图像中时,执行此操作的语法将允许您的蒙版对称放置。当我们回到最后一个问题时,我会谈论这个问题。
我们可以通过调整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
。我们这样做的原因是为了使面具兼容,可以放在你的图像中。
您所需要做的就是找出您想要放置高斯蒙版的中心的行和列。我们假设这些变量存储在row
和col
中。因此,假设您要将其放在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
。
这应该有希望并充分回答您的问题。祝你好运!