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
边界将由高度的局部最小值确定。找到它们并不像第一眼看上去那么容易。我想试试这个:
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
值或稍后将小区域合并到大区域中来避免100
填充,然后用101
等填充。在泛光填充期间,您可以计算填充区域的min、max、avg
高度,以便稍后丢弃过于平坦的区域(因为它们不被视为丘陵/山脉)边界将由高度的局部最小值确定。找到它们并不像第一眼看上去那么容易。我想试试这个:
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
值或稍后将小区域合并到大区域中来避免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