使用线边缘的 Matlab 图像分割

Matlab image segmentation by using line edges

我想将图像分割成 3 个部分,如图 2 所示。我所做的第一项工作是使用 canny 边缘检测来提取边缘,如图 3 所示,使用下面的代码。

rgb = imread('Camera_205.png');
I = rgb2gray(rgb);
imshow(I)

figure
BW = edge(I,'canny',0.6);
BW = bwareaopen(BW, 80);
imshow(BW);

我的问题是如何使用这个边缘将图像分割成 3 个部分?我认为区域增长方法在这里不起作用,因为这条线没有连接到图像的末尾。您可以随意下载第一张图片并进行测试。谢谢您的帮助。

这些是边缘伪影。 Canny 在内部使用梯度并且不清楚如何计算图像边界处的梯度(它们在 matlab 的 edge 中也是模糊的)。只需裁剪黑白图像。

编辑:

edge 中高斯模糊的 sigma 默认值为 1.41 像素。所以如果你裁剪大约两倍和额外的 2 个像素来解释用于从每个边缘计算梯度(总共 5 个像素)的 sobel 内核(我的意思是图像的边缘,而不是检测到的边缘),你将摆脱边缘伪影。

像这样

BW_cropped = BW(5:end-5,5:end-5)

如果您的图像处理涉及查找图像中某物的位置,则将这 5 个像素添加回每个坐标。

编辑 2:

例如,要获取裁剪图像区域中的所有像素,请像这样在倒置图像上使用 bwconncomp

CC=bwconncomp(not(BW_cropped),4);

结果:

>> CC

CC = 

    Connectivity: 4
       ImageSize: [471 631]
      NumObjects: 3
    PixelIdxList: {[40405x1 double]  [254682x1 double]  [1430x1 double]}

因此您得到并输出结构,其中字段 PixelIdxList 为您提供区域中所有像素的索引的三个元素(区域数)(索引到 cropped_BW)。

然后您可以在 regionprops 函数中使用 CC 来获取有关您所在区域的一些信息(例如区域或质心,请参阅帮助了解所有选项)

编辑 3:

示例代码:

a = imread('XEDCa.png');

I = rgb2gray(a);
BW = edge(I,'canny',0.6);
BW_cropped = BW(5:end-5,5:end-5);
CC=bwconncomp(not(BW_cropped),4)
imagesc(labelmatrix(CC))

结果: