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

Image 如何将高斯形状的对象添加到图像中?,image,matlab,image-processing,Image,Matlab,Image Processing,我感兴趣的是在现有图像中添加一个高斯形状的对象,类似于附加的图像。我想将对象添加到的基本图像是8位无符号图像,其值范围为0-255。附加图像中的明亮物体实际上是一棵树,由归一化差异植被指数(NDVI)数据表示。所附的脚本是我到目前为止所拥有的。如何将数值范围为110-155的高斯形状的对象(即树)添加到现有NDVI图像 该脚本可用于计算NDVI file='F:\path\to\fourband\image.tif'; [I R]=geotiffread(文件); outputdir='F:

我感兴趣的是在现有图像中添加一个高斯形状的对象,类似于附加的图像。我想将对象添加到的基本图像是8位无符号图像,其值范围为0-255。附加图像中的明亮物体实际上是一棵树,由归一化差异植被指数(NDVI)数据表示。所附的脚本是我到目前为止所拥有的。如何将数值范围为110-155的高斯形状的对象(即树)添加到现有NDVI图像

该脚本可用于计算NDVI


file='F:\path\to\fourband\image.tif';
[I R]=geotiffread(文件);
outputdir='F:\path\to\output\directory''
%%进行NDVI计算
NIR=im2single(I(:,:,4));
红色=单个(I(:,:,1));
ndvi=(近红外-红色)。/(近红外+红色);
ndvi=双(ndvi);
%%将NDVI拉伸至0-255,并转换为8位无符号整数
ndvi=地面((ndvi+1)*128);%[-1 1] -> [0 256]
ndvi(ndvi<0)=0;%其实没必要,只是以防万一&为了对称
ndvi(ndvi>255)=255;%如果原始值正好是1
ndvi=uint8(ndvi);%将数据类型从double更改为uint8
%%需要在这里的图像中添加一个随机树
%%写信给geotiff
tiffdata=geotiffinfo(文件);
outfilename=[outputdir'ndvi_u'.tif'];
geotiffwrite(outfilename,ndvi,R,'GeoKeyDirectoryTag',tiffdata.GeoTIFFTags.GeoKeyDirectoryTag)

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

  • 我们如何生成高斯形状的对象
  • 我们如何做到这一点,使值在110-155之间
  • 我们如何在我们的形象中体现这一点
  • 让我们分别回答每一个问题,每个问题的顺序建立在前面问题的知识基础上

    我们如何生成高斯形状的对象? 您可以使用图像处理工具箱中的
    fspecial
    为您生成高斯分布:

    mask = fspecial('gaussian', hsize, sigma);
    
    hsize
    指定高斯分布的大小。你还没有在你的问题中详细说明,所以我假设你会想自己来处理这个问题。这将产生一个
    hsize x hsize
    高斯矩阵
    sigma
    是高斯分布的标准偏差。同样,您也没有指定这是什么<代码>西格玛和
    hsize
    齐头并进。参考我的,将掩模的标准偏差设置为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
    。我们这样做的原因是为了使遮罩与放置在图像中的遮罩兼容

    我们如何在我们的形象中体现这一点? 你所要做的就是找出你想要放置高斯遮罩的中心的行和列。假设这些变量存储在
    中。因此,假设您想将其放入
    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列向右。如果遮罩的大小是偶数,那么我们将在如何放置遮罩上有一个模糊的选择。例如,如果遮罩尺寸为4 x 4,我们应该选择第二行还是第三行作为中心轴?因此,为了简化事情,请确保遮罩的大小为奇数,或者
    mod(hsize,2)==1


    希望这能充分回答你的问题。祝你好运

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

  • 我们如何生成高斯形状的对象
  • 我们如何做到这一点,使值在110-155之间
  • 我们如何在我们的形象中体现这一点
  • 让我们分别回答每一个问题,每个问题的顺序建立在前面问题的知识基础上

    我们如何生成高斯形状的对象? 您可以使用图像处理工具箱中的
    fspecial
    为您生成高斯分布:

    mask = fspecial('gaussian', hsize, sigma);
    
    hsize
    指定高斯分布的大小。你还没有在你的问题中详细说明,所以我假设你会想自己来处理这个问题。这将产生一个
    hsize x hsize
    高斯矩阵
    sigma
    是高斯分布的标准偏差。同样,您也没有指定这是什么<代码>西格玛和
    hsize
    齐头并进。参考我的,将掩模的标准偏差设置为3-sigma规则通常是一个好规则。因此,一旦您设置了
    hsize
    ,您就可以将
    sigma
    计算为:

    sigma = (hsize-1) / 6;
    
    同样地,找出什么是
    hsize
    ,然后计算你的
    sigma
    。之后,调用
    fspec