【问题标题】:Extract Rectangular Image from Scanned Image从扫描图像中提取矩形图像
【发布时间】:2014-12-22 12:10:44
【问题描述】:

我已经扫描了纸币副本,我只需要从中提取矩形纸币。 尽管扫描的副本背景非常空白,但笔记本身可以正确旋转或对齐。我正在使用matlab。

示例输入:

示例输出:

我尝试使用阈值处理和 canny/sobel 边缘检测无济于事。 我也尝试了here 给出的解决方案,但它会检测到整个图像进行裁剪,并且不适用于旋转图像。

PS:我的主要目标是确定货币的面额。我认为我可以使用以下几种方法:

  1. 基于颜色,因为所有纸币都有不同的原色。 这种方法的优点是它独立于 输入图像的旋转或缩放。
  2. 检测纸币左下角的黑色小三角形。这个造型很独特 对于每个面额。
  3. 计算 2 张图像之间的差异。由于这是一个小型项目,所有输入图像都将具有相同的 dpi 和分辨率,因此,一旦对齐,输入图像与真实图像之间的差异就可以给出粗略的估计。

您认为哪种方法最可行?

【问题讨论】:

  • 如果每种货币都有自己的颜色,那么就选择基于颜色的,看起来是最强大的一种。如果你这样做,你甚至可能不需要裁剪图像!
  • 我是这么认为的。但是我可以使用其他方法作为比较研究来显示这些方法之间的准确性差异。有什么想法吗?
  • 好吧,你可以这样做,那将是一个很好的项目;)。关于取出白色:尝试您链接的方法(即使是旋转图像)。如果您检测到 4 个角,您可能可以在移除几乎所有背景后旋转图像。
  • 好的。我使用了阈值处理、中值过滤器和轻微裁剪来得到这个:imgur.com/dGnq07ZHow do find the angle to which to rotate the boundary box?
  • 成功了吗?你试过我的答案吗?

标签: matlab image-processing crop image-segmentation edge-detection


【解决方案1】:

看起来你比你看起来更先进(看到你的cmets),这很好!我将或多或少地向您展示解决问题的方法,但我不会发布整个代码,只是发布重要部分。

您的图像经过裁剪和分割。首先,您需要确保您的图像没有孔。所以填满它们!

Iinv=I==0; % you want 1 in money, 0 in not-money;
Ifill=imfill(Iinv,8,'holes');     % Fill holes

之后,您只想获取图像的边界:

Iedge=edge(Ifill);

最后你想得到那个正方形的角:

C=corner(Iedge);

现在您有 4 个角,您应该能够知道这个旋转的“正方形”的角度。一旦你得到它:

Irotate=imrotate(Icroped,angle);

一旦到了这里,您可能想再次裁剪它以得到钱! (啊啊,钱总是作为目标!)

希望这会有所帮助!

【讨论】:

  • 感谢您的回答!它似乎工作得很好,但有一个小问题 - 我试图解决它,但它仍然存在。明天早上我会详细发布。感谢您的帮助!
  • corner 函数在图像中找到许多角点,其中只有 4 个是正确的。这样做的原因是在此函数调用之前完成的边缘检测返回一个非常波浪和“边缘”的轮廓。当我尝试使用 max_x、max_y 等找到 4 个真正的角时,由于边缘的波浪性质,我得到了倾斜输入的良好结果,但对齐输入却没有。示例:imgur.com/a/k9SxD 红色是所有角,蓝色是检测到的 4 个真正的角。
  • @vinayakshukl 有趣的问题....我建议您使用 LoG 或高斯滤波器对 Iedge 图像进行平滑处理,以查看这些角落是否有点平滑。您也可以尝试扩张和腐蚀,看看是否能获得更平滑的图像。但是,您的问题似乎非常适合另一个 SO 问题!所以,如果这个建议不起作用,我建议你打开一个关于角落的具体问题的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多