【问题标题】:Finding notes in an image在图像中查找笔记
【发布时间】:2015-02-25 04:44:27
【问题描述】:

我有这样的图像。我想找到笔记的位置。找到它们的最佳方法是什么? (它们不是圆形,而且它们很小,所以 circlefinder 找不到它们!)

Image of Notes !

【问题讨论】:

  • 哇,这是一个有趣的问题!这肯定会很困难,因为与音符相比,音符有相似的结构(谱号、升/降号)。形状分析在这里可能很困难。你只想要笔记吗?周围的员工队伍呢?将这些作为提取结果的一部分是否可以接受?
  • 我只想要每个音符的圆圈!其他线路对我来说并不重要
  • 部分问题可能是纸币通常不是圆形印刷的——它们是椭圆形的。某种形式的模板匹配可能会起作用 - 捕获一个音符头的小图像和每侧几个像素。然后扫描图像寻找相似的东西。
  • 这会很困难,因为有些笔记已填满,有些则未填满。西蒙 B 可能正在做某事。也许做一个模板匹配,但您将需要多个模板 - 一个用于您要检测的每个音符。此外,当您到达贝司谱表中的四分音符时,模板匹配可能会失败。恐怕这个问题太宽泛了,无法在一个问题上解决。
  • 我认为@SimonB 的模板匹配想法很有前途,也许还有一些额外的规则可以将注释与图像中其他类似的椭圆形对象隔离开来。

标签: matlab image-processing


【解决方案1】:

这里有一些代码可以让你开始......这并不完美,但它很有趣哈哈。

我所做的是用磁盘结构元素腐蚀图像,直到图像中剩下的形状看起来最像圆形。然后我再次侵蚀,但这次是用一个与音符角度接近的线条结构元素;我想它大约是 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 看起来像这样:

%// 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 看起来像这样:

然后找到质心并绘制它们

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

输出:

没有检测到空音符,但我猜这可以使用其他形态学操作进行管理。

希望有帮助!

【讨论】:

  • 要检测空笔记,也许对图像的reverse应用相同的操作。无论哪种方式,这都超过了 OP 应得的。太棒了! +1。
  • 哦好主意@rayryeng 我没想到!我尝试在磁盘前使用strel 行,但结果并不好,我懒得再深入了:) 感谢+1!
  • 你也可能需要做一个bwareaopen 因为如果我们在逆向应用相同的逻辑,仍然可能有一些噪音......就像高音谱号顶部的孔在例如,员工的最高层......仍然,非常好!
  • 好主意!我必须说我没想到imerode 会这么容易地清理这么多东西:)
  • 如果你只是在应用磁盘元素之前填写空笔记怎么办?我看不到任何其他具有空中心并且很小的元素。非常好的工作。我也 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2016-12-15
  • 2023-03-22
  • 2014-12-26
  • 2020-11-27
相关资源
最近更新 更多