我是matlab新手。我有图像块如下图所示: 水平垂直只有线
白人显示像素它们的值等于1
和黑人显示像素它们的值等于0
,
我想vertical only lines
。这意味着,如下图所示水平线应该被删除:
此外,我想horizontal only lines
。这意味着如下图所示的垂直线应删除:
我怎样才能做到这一点在Matlab
?我更喜欢这种形态操作。
我是matlab新手。我有图像块如下图所示: 水平垂直只有线
白人显示像素它们的值等于1
和黑人显示像素它们的值等于0
,
我想vertical only lines
。这意味着,如下图所示水平线应该被删除:
此外,我想horizontal only lines
。这意味着如下图所示的垂直线应删除:
我怎样才能做到这一点在Matlab
?我更喜欢这种形态操作。
假设你的图像是BW
下面:
% detecting all connected regions:
B = bwboundaries(BW,4);
这导致包含由连接与从4个侧面中的一个连接的值1
相邻小区进行的所有的“贴剂”的单元阵列B
即不在对角线上。
B =
[11x2 double]
[ 2x2 double]
[ 3x2 double]
[ 3x2 double]
[ 2x2 double]
[ 3x2 double]
[ 2x2 double]
[ 2x2 double]
[ 3x2 double]
[ 3x2 double]
[ 2x2 double]
[11x2 double]
例如:
>> B{6}
ans =
3 7
3 8
3 7
每一行是一个单元的坐标。第一列是“行,第二列”,第一个和最后一个单元总是相同的。
现在我们需要循环遍历B
中的单元格,并查找它们中哪些是水平或垂直的线条,并将它们保存到新的矩阵中。
% matrices for horizontal and vertical lines:
BWh = zeros(size(BW)); % horizontal lines
BWv = zeros(size(BW)); % vertical lines
for k = 1:numel(B)
% if the coordinates changes ONLY vertically:
% a vertical line is where all the coulmn indecies are the same
% and there are different row indices
if all(B{k}(1,2)==B{k}(:,2)) && B{k}(1,1)~=B{k}(2,1)
BWv(sub2ind(size(BW),B{k}(:,1),B{k}(:,2))) = 1;
end
% if the coordinates changes ONLY horizontaly:
% a vertical line is where all the row indecies are the same
% and there are different column indices
if all(B{k}(1,1)==B{k}(:,1)) && B{k}(1,2)~=B{k}(2,2)
BWh(sub2ind(size(BW),B{k}(:,1),B{k}(:,2))) = 1;
end
end
subplot 131
imagesc(BWh)
title('Horizontal lines')
subplot 132
imagesc(BWv)
title('Vertical lines')
“对角线边缘”是什么留给我们排除线后,所以我们只是看什么,我们没有到目前为止发现:
subplot 133
imagesc(BW & ~BWv & ~BWh)
title('Diagonal edges')
colormap 'gray'
这种方法将忽略任何不是单细胞粗线的物体,因此,例如,下图中间的正方形将仅显示在对角线边缘图案:
不好意思,有什么方法可以识别对角线边缘吗?我宁愿不使用图像减法。 –
亲爱的'EBH',如果有可能,请提供更多关于'算法如何执行'的评论' –
@ Babak.Abad我会在几个小时内添加更多评论。什么是_diagonal-only edges_? – EBH
有趣的问题,因为有很多方法可以做到这一点。实质上,您需要取出特定维度的连续像素。 我看到要解决这个问题的一种方法是用[1 1]
或[1 1]'
向量进行卷积,然后取出所有获得值2的元素。
bw(conv2(bw,[1 1],'same')==2)=0;
这仍然会离开,你可以取出的单个像素轻易使用
bw = bwareaopen(bw,2) ;
这仅仅是个主要的想法,你可能必须是周围的边缘多加小心,或用零垫避免边缘文物,CONV2可以)...
另一个想法,使用Hough transform检测线,只保留那些有THETA = 0或90度......
谢谢,寻求答案。一种新的方式...但第二个答案是正确和完整的。 +1为您的答案 –
我想你会ñ定义一些更多的规则,如 1)1个像素既不能水平也不能垂直,那么它是否会被删除? 2)如果水平线和垂直线在某一点相交,那么移除水平线也会从垂直线中移除一个像素。你想怎么处理它? 3)你是否同意调用一组像素形成一条直线所需的最小像素数是2? 定义这些之后,可能会直接检测感兴趣的黑色像素的连续窗口。 – Abhinav