Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 使用占卜术分离形状_Matlab_Image Processing - Fatal编程技术网

Matlab 使用占卜术分离形状

Matlab 使用占卜术分离形状,matlab,image-processing,Matlab,Image Processing,使用强度值的分布,我需要在下图中分离两个形状:- 基本上我想用它们的坡度来区分两座“山”。你对如何设计算法有什么建议吗 原始图像如下所示: 边界将由高度的局部最小值确定。找到它们并不像第一眼看上去那么容易。我想试试这个: 创建清晰的ROI掩模图像 让我们定义具有以下含义的ROI图像颜色: 0 - empty space 1 - slope from left 2 - slope from right 3 - hill border 10 - mountain 1 11 - mounta

使用强度值的分布,我需要在下图中分离两个形状:-

基本上我想用它们的坡度来区分两座“山”。你对如何设计算法有什么建议吗

原始图像如下所示:


边界将由高度的局部最小值确定。找到它们并不像第一眼看上去那么容易。我想试试这个:

  • 创建清晰的ROI掩模图像

    让我们定义具有以下含义的ROI图像颜色:

    0  - empty space
    1  - slope from left
    2  - slope from right
    3  - hill border
    10 - mountain 1
    11 - mountain 2
    12 - mountain 3 ...
    
    并用
    0

  • x
    方向扫描源图像

    并从
    x+
    方向设置所有下坡坡度:

    for (y=0;y<ys;y++)
     for (x=1;x<=xs;x++)
      if ((ROI[y][x]==0)&&(height[y][x-1]>height[y][x]+treshold))
       ROI[y][x]=1;
    
    现在,您需要在ROI中找到
    1,2
    之间的区域,并将它们设置为
    3
    ,这可能是边界。在此之后,清除带有
    0
    的所有
    1,2
    ROI像素。
    treshold
    只是对山坡的敏感性。此算法最适用于平滑图像,因此如果存在过多的瑕疵,可以在应用此算法之前尝试对源图像进行几次平滑

  • 过滤掉过小的边框

    您应该过滤掉设置为
    3
    的太小的ROI区域,以避免太小的山丘将整个事情弄糟。可以使用
    treshold
    值或稍后将小区域合并到大区域中来避免

  • Do#2,#3表示方向(也可能是对角线)

  • 通过morfologic手术扩大ROI边界

  • 使用泛光填充填充ROI中的空白

    首先找到设置为零的ROI像素,然后用
    100
    填充,然后用
    101
    等填充。在泛光填充期间,您可以计算填充区域的
    min、max、avg
    高度,以便稍后丢弃过于平坦的区域(因为它们不被视为丘陵/山脉)


  • 边界将由高度的局部最小值确定。找到它们并不像第一眼看上去那么容易。我想试试这个:

  • 创建清晰的ROI掩模图像

    让我们定义具有以下含义的ROI图像颜色:

    0  - empty space
    1  - slope from left
    2  - slope from right
    3  - hill border
    10 - mountain 1
    11 - mountain 2
    12 - mountain 3 ...
    
    并用
    0

  • x
    方向扫描源图像

    并从
    x+
    方向设置所有下坡坡度:

    for (y=0;y<ys;y++)
     for (x=1;x<=xs;x++)
      if ((ROI[y][x]==0)&&(height[y][x-1]>height[y][x]+treshold))
       ROI[y][x]=1;
    
    现在,您需要在ROI中找到
    1,2
    之间的区域,并将它们设置为
    3
    ,这可能是边界。在此之后,清除带有
    0
    的所有
    1,2
    ROI像素。
    treshold
    只是对山坡的敏感性。此算法最适用于平滑图像,因此如果存在过多的瑕疵,可以在应用此算法之前尝试对源图像进行几次平滑

  • 过滤掉过小的边框

    您应该过滤掉设置为
    3
    的太小的ROI区域,以避免太小的山丘将整个事情弄糟。可以使用
    treshold
    值或稍后将小区域合并到大区域中来避免

  • Do#2,#3表示方向(也可能是对角线)

  • 通过morfologic手术扩大ROI边界

  • 使用泛光填充填充ROI中的空白

    首先找到设置为零的ROI像素,然后用
    100
    填充,然后用
    101
    等填充。在泛光填充期间,您可以计算填充区域的
    min、max、avg
    高度,以便稍后丢弃过于平坦的区域(因为它们不被视为丘陵/山脉)


  • 我会使用图像处理工具箱。从您的图像开始,
    img

    figure; imshow(img);
    

    第一步也是最棘手的一步是界定山脉。我们可以满足于引入一个上限。但根据您的数据和期望,您也可以对该区域进行限制。这里我首先考虑的是高度:

    bw = im2bw(img, .85);
    figure; imshow(bw)
    

    现在我过滤掉非常小的区域。您也可以使用此阈值

    bw_cleaned = bwareaopen(bw, 100, 4);
    figure; imshow(bw_cleaned)
    

    接下来的步骤是以图示峰值的区域合并在一起的方式扩展白色区域,然后围绕每个峰值制作凸面外壳,最后找到其位置:

    final_bw = bwconvhull(imdilate(bw_cleaned, strel('disk', 50)), 'objects');
    figure; imshow(final_bw)
    s = regionprops(final_bw, 'Centroid');
    centroids = cat(1, s.Centroid);
    hold on
    plot(centroids(:,1), centroids(:,2), 'b*')
    


    使用
    regionprops
    可以做的不仅仅是找到质心

    我会用图像处理工具箱来做。从您的图像开始,
    img

    figure; imshow(img);
    

    第一步也是最棘手的一步是界定山脉。我们可以满足于引入一个上限。但根据您的数据和期望,您也可以对该区域进行限制。这里我首先考虑的是高度:

    bw = im2bw(img, .85);
    figure; imshow(bw)
    

    现在我过滤掉非常小的区域。您也可以使用此阈值

    bw_cleaned = bwareaopen(bw, 100, 4);
    figure; imshow(bw_cleaned)
    

    接下来的步骤是以图示峰值的区域合并在一起的方式扩展白色区域,然后围绕每个峰值制作凸面外壳,最后找到其位置:

    final_bw = bwconvhull(imdilate(bw_cleaned, strel('disk', 50)), 'objects');
    figure; imshow(final_bw)
    s = regionprops(final_bw, 'Centroid');
    centroids = cat(1, s.Centroid);
    hold on
    plot(centroids(:,1), centroids(:,2), 'b*')
    


    使用
    regionprops
    可以做的不仅仅是找到质心

    把两座山分开,同时又因为一座山本身的裂缝而不把它分开,这似乎比你想象的要困难得多。ref:您可以首先将此内核应用于图像中的每一组相邻像素
    内核=[0-1/4 0;-1/4 1-1/4;0-1/4 0]
    此值将有助于找到局部最大值。分离两座山,同时由于其自身的裂缝而不分离一座山似乎比您预期的问题更多。ref:您可以首先将这个内核应用于每一组相邻的pi