我想将图像分割成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个部分?我认为区域增长方法在这里不起作用,因为线没有连接到图像的末尾。您可以随意下载第一张图像并进行测试。谢谢您的帮助。
答案 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))
结果: