在 MATLAB 中检测图像中不规则区域的几何形状
Detecting the geometry of irregular regions in an image in MATLAB
我有一个 2D 图像,它是通过对原始图像应用 k 均值聚类而生成的。应用聚类来检测原始图像中的不同颜色区域。这是生成的集群的一个示例,
彩色区域(紫色)是原始二维图像中簇的形状。我希望能够检测(并存储)这个簇的形状并将其应用于另一张图片。更详细地说,捕捉到这个形状后,我想在另一个图像中绘制(或构建)一个具有相似形状的区域,并对其应用相同的颜色。
我在 MATLAB 中搜索过这种检测功能,但我发现的大多数算法都检测到规则形状,如正方形和圆形。我尝试按照此处答案的建议使用 active activecontour,Random object detection matlab. Based on the first code provided at MATLAB website here, http://www.mathworks.com/help/images/ref/activecontour.html,我已经编写了这段代码,
I = imread('clusterimg.png');
imshow(I)
title('Original Image');
mask = zeros(size(I));
mask(25:end-25,25:end-25) = 1;
figure, imshow(mask);
title('Initial Contour Location');
bw = activecontour(I,mask,300);
figure, imshow(bw);
title('Segmented Image');
但是,当我 运行 它时,我得到了这个错误,
Undefined function 'activecontour' for input arguments of type 'uint8'.
Error in geometrydetection (line 11)
bw = activecontour(I,mask,300);
我需要知道的是,
1- 我在上面的代码中犯了什么错误?
2- activecontour
是实现我上面描述的几何检测的好方法吗?如果是,在检测到一个区域的几何形状后,如何在另一幅图像中构建相似的区域?如果不是,能否请您提供一种替代方法,可以检测区域的几何形状,并在另一幅图像中构建相似的区域?
编辑:mvai 使用 bwconncomp
的建议可能不错。我找到了这个例子(在此处可用,http://www.mathworks.com/help/images/labeling-and-measuring-objects-in-a-binary-image.html),
cc = bwconncomp(BW)
cc =
Connectivity: 8
ImageSize: [8 9]
NumObjects: 3
PixelIdxList: {[6x1 double] [6x1 double] [5x1 double]}
谁能告诉我是否有办法知道每个组件与另一个组件之间的距离?
谢谢。
函数 bwconncomp
可能会有所帮助。它在二值图像中寻找连通分量。
CC = bwconncomp(I,connectivity);
从CC
你可以得到区域的数量和它们的索引,查看帮助文档。
二维图像的连通性参数基本上是一个由 0 和 1 组成的 3x3 矩阵。它表示相对于中心像素的邻域位置。如果使用标量值 4
,生成的矩阵将为:
0 1 0
1 1 1
0 1 0
而 8
是:
1 1 1
1 1 1
1 1 1
由于您的区域没有特定的形状,我相信默认值 (8
) 适合您。
我有一个 2D 图像,它是通过对原始图像应用 k 均值聚类而生成的。应用聚类来检测原始图像中的不同颜色区域。这是生成的集群的一个示例,
彩色区域(紫色)是原始二维图像中簇的形状。我希望能够检测(并存储)这个簇的形状并将其应用于另一张图片。更详细地说,捕捉到这个形状后,我想在另一个图像中绘制(或构建)一个具有相似形状的区域,并对其应用相同的颜色。
我在 MATLAB 中搜索过这种检测功能,但我发现的大多数算法都检测到规则形状,如正方形和圆形。我尝试按照此处答案的建议使用 active activecontour,Random object detection matlab. Based on the first code provided at MATLAB website here, http://www.mathworks.com/help/images/ref/activecontour.html,我已经编写了这段代码,
I = imread('clusterimg.png');
imshow(I)
title('Original Image');
mask = zeros(size(I));
mask(25:end-25,25:end-25) = 1;
figure, imshow(mask);
title('Initial Contour Location');
bw = activecontour(I,mask,300);
figure, imshow(bw);
title('Segmented Image');
但是,当我 运行 它时,我得到了这个错误,
Undefined function 'activecontour' for input arguments of type 'uint8'.
Error in geometrydetection (line 11)
bw = activecontour(I,mask,300);
我需要知道的是,
1- 我在上面的代码中犯了什么错误?
2- activecontour
是实现我上面描述的几何检测的好方法吗?如果是,在检测到一个区域的几何形状后,如何在另一幅图像中构建相似的区域?如果不是,能否请您提供一种替代方法,可以检测区域的几何形状,并在另一幅图像中构建相似的区域?
编辑:mvai 使用 bwconncomp
的建议可能不错。我找到了这个例子(在此处可用,http://www.mathworks.com/help/images/labeling-and-measuring-objects-in-a-binary-image.html),
cc = bwconncomp(BW)
cc =
Connectivity: 8
ImageSize: [8 9]
NumObjects: 3
PixelIdxList: {[6x1 double] [6x1 double] [5x1 double]}
谁能告诉我是否有办法知道每个组件与另一个组件之间的距离?
谢谢。
函数 bwconncomp
可能会有所帮助。它在二值图像中寻找连通分量。
CC = bwconncomp(I,connectivity);
从CC
你可以得到区域的数量和它们的索引,查看帮助文档。
二维图像的连通性参数基本上是一个由 0 和 1 组成的 3x3 矩阵。它表示相对于中心像素的邻域位置。如果使用标量值 4
,生成的矩阵将为:
0 1 0
1 1 1
0 1 0
而 8
是:
1 1 1
1 1 1
1 1 1
由于您的区域没有特定的形状,我相信默认值 (8
) 适合您。