Bor*_*lis 0 matlab image image-processing
我有兴趣在现有图像中添加单个高斯形状的对象,如附图中所示.我想要添加对象的基本图像是8位无符号,值为0-255.附着图像中的明亮物体实际上是由归一化差异植被指数(NDVI)数据表示的树.附件脚本是我到目前为止所拥有的.如何添加一个高斯形状的abject(即树),其值从110到155到现有的NDVI图像?
此处提供的示例数据可与此脚本一起用于计算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)
Run Code Online (Sandbox Code Playgroud)
你的帖子问的是如何做三件事:
让我们分别回答每个问题,每个问题的顺序都建立在前面问题的基础上.
您可以使用fspecial图像处理工具箱为您生成高斯:
mask = fspecial('gaussian', hsize, sigma);
Run Code Online (Sandbox Code Playgroud)
hsize指定高斯的大小.你没有在你的问题中指定它,所以我假设你想要自己玩这个.这将产生hsize x hsize高斯矩阵. sigma是高斯分布的标准偏差.同样,你还没有具体说明这是什么. sigma并hsize携手并进.参考我之前关于如何确定的帖子sigma,将掩码的标准偏差设置为3-sigma规则通常是一个很好的规则.因此,一旦设置hsize,您可以计算sigma为:
sigma = (hsize-1) / 6;
Run Code Online (Sandbox Code Playgroud)
因此,弄清楚是什么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;
Run Code Online (Sandbox Code Playgroud)
一般情况下,如果你想调整高斯蒙版中的值以使其变为[a,b],则首先将0和1之间的值标准化,然后执行:
maskAdjust = uint8((b-a)*maskAdjust) + a;
Run Code Online (Sandbox Code Playgroud)
您会注意到我们将此蒙版投射到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;
Run Code Online (Sandbox Code Playgroud)
hsize应该奇怪的原因是允许在图像中均匀放置形状.例如,如果掩码大小为5 x 5,则上述语法ndvi简化为:
ndvi(row-2:row+2, col-2:col+2) = maskAdjust;
Run Code Online (Sandbox Code Playgroud)
从面具的中心,它在上面2行和下面2行延伸.列从左侧的2列延伸到右侧的2列.如果面罩尺寸是均匀的,那么我们就应该如何放置面罩有一个模糊的选择.如果掩模尺寸为4 x 4,我们应该选择第二行还是第三行作为中心轴?因此,为了简化操作,请确保蒙版的大小是奇数,或者mod(hsize,2) == 1.
这应该有希望并充分回答您的问题.祝好运!
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |