2015-02-24 38 views
1

我有这样的图像。我想找到笔记的位置。找到它们的最好方法是什么? (他们不是圈子,他们是如此之小,所以circlefinder无法找到它们!)在图像中查找笔记

enter image description here

Image of Notes !

+0

哇,这是一个有趣的问题!这肯定会很难,因为与笔记相比,笔记有类似的结构(谱号,尖/平标志)。这里的形状分析可能很困难。你只是想要笔记吗?那周围的员工队伍呢?将这些作为提取结果的一部分是否可以接受? – rayryeng 2015-02-24 17:10:03

+0

我只想要每个音符的圆圈!其他线对我来说并不重要 – onlyappleapp 2015-02-24 17:13:54

+1

问题的一部分可能是笔记通常不会打印成圆形 - 它们是椭圆形的。某种形式的模板匹配可能会奏效 - 捕获一个音符头和每边几个像素的小图像。然后扫描图像寻找类似的东西。 – 2015-02-24 17:17:25

回答

6

下面是一些代码让你去......这不是完美的,但这是一个有趣的哈哈哈哈。

我所做的就是用磁盘结构元素腐蚀图像,直到图像中留下的是形状,看起来最像圆圈。然后我再次侵蚀,但这次是以一个与音符接近的角度定向的线结构元素;我估计它大约是15度。然后,打电话regionprops获取质心,然后绘制它们。

代码:

clear 
clc 

BW = im2bw(imread('Notes.png')); 
BW = imclearborder(BW); 

%//Erode the image with a disk structuring element to obtain circleish 
%// shapes. 
se = strel('disk',2);   
erodedBW = imerode(BW,se); 

这里erodedBW看起来是这样的:

enter image description here

%// Erode again with a line oriented at 15 degrees (to ~ match orientation of major axis of notes...very approximate haha) 

se2 = strel('line',5,15); 
erodedBW2 = imerode(erodedBW,se2); 

erodedBW2看起来是这样的:

enter image description here

然后找到重心,绘制他们

S = regionprops(erodedBW2,'Centroid'); 

figure; 
imshow(BW) 
hold on 
for k = 1:numel(S) 

    scatter(S(k).Centroid(:,1), S(k).Centroid(:,2),60,'filled') 

end 

输出:未检测

enter image description here

空笔记,但在使用其他形态学操作我想是可控的。

希望有帮助!

+1

要检测空白音符,可能对图像的**反转**应用相同的操作。无论如何,这不仅仅是OP应得的。好样的! +1。 – rayryeng 2015-02-24 22:35:28

+0

哦,好主意@rayryeng我没想过!我尝试在磁盘前使用'strel'这一行,但结果并不好,我觉得太懒了,以至于无法进一步深入:)感谢+1! – 2015-02-24 22:47:17

+0

你也可能需要做一个'bwareaopen',因为如果我们在倒数上应用相同的逻辑,仍然可能会有一些噪音......例如在工作人员顶部的高音谱号顶部的孔。 ..还是很好的! – rayryeng 2015-02-24 22:52:29