使用线条边缘进行Matlab图像分割

时间:2016-03-11 04:41:41

标签: matlab edge-detection

我想将图像分割成3个部分,如图2所示。我做的第一项工作是使用精确边缘检测来提取边缘,如图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个部分?我认为区域增长方法在这里不起作用,因为线没有连接到图像的末尾。您可以随意下载第一张图像并进行测试。谢谢您的帮助。 Original Color Image Image that needs to be segmented to 3 parts Edge image

1 个答案:

答案 0 :(得分:2)

这些是边缘工件。 Canny在内部使用渐变,并且不清楚如何在图像边界处计算渐变(在matlab的edge中它们也是模糊的)。只需裁剪BW图像。

编辑:

edge中高斯模糊的sigma默认值为1.41像素。因此,如果您裁剪大约两倍和另外2个像素来计算用于计算每个边缘的渐变(总共5个像素)的sobel内核(我的意思是图像的边缘,而不是检测到的边缘),您将摆脱边缘文物。

喜欢这个

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

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

EDIT2:

例如,要获取裁剪图像区域中的所有像素,请在倒像上使用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来获取有关您所在区域的信息(例如区域或质心,请参阅所有操作的帮助)

EDIT3:

示例代码:

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))

结果:

enter image description here