在图像上查找区域 - 自动旋转图像OpenCv

时间:2013-07-13 16:43:38

标签: c# c++ matlab opencv image-processing

我有一张图片,我想要旋转此图片,如下所示: 轮换必须是自动的。另一方面,必须计算旋转角度。

[1 - 图片]

enter image description here

在openCV上有这个轮换的想法吗?

如何在此图像上提取一个小矩形?像这样 : (我用红色标记了一些区域)

[2 - 图片]

enter image description here

有没有想过在OpenCV上从这张图片中提取这个区域?

1 个答案:

答案 0 :(得分:2)

我不知道openCV,但你添加了C#和C ++标签,这让我想你会接受一种可以用这些语言实现的算法。

回答你的第一个问题:

如果您的图像与您提供的图像完全相似,您可以执行以下操作(这些不一定是顺序步骤,它们的编号仅仅是为了便于参考):

  1. 转换为黑色&白色(你可以在概念上做这个,如果你愿意,通过比较像素值和阈值,在下面的内容)

  2. 以垂直,水平和对角线单像素步骤沿着黑色轮廓行进

  3. 在旅行时记住N对坐标,因此N低于图像直线的预期最小长度(以像素为单位)(您必须调整N:太长时间会导致数据太少) ,太短会给你太多的噪音)

  4. 从当前点的坐标和N点后退,计算m的{​​{1}}和q y = m x + q或{ {1}}和abs(Δx) ≤ abs(Δy) m'否则,并根据您需要的分辨率制作4个直方图

  5. 平滑你的直方图(例如,通过向每个通道添加一些相邻通道的值)

  6. 找到q'x = m' y + q'mm'的最大值,并删除q的最大值周围q'qq'的另外2个(本地)最大值;这些将是您对矩形的4条边界线方程参数的估计,q(取决于您所需的最终结果,您可以使用q'm ≅ -m',或者,例如m

  7. 找到将矩形放入所需位置的旋转或仿射变换(例如,上述两条线的交点可能必须转换到某个位置),并应用它

  8. 通过在每个步骤中在围绕以前一步骤的像素结束的当前像素的圆形探测中找到8个中的第一个黑色像素来完成点2。例如,如果您的最后一步是在NE(东北)方向,并且您沿着轮廓顺时针行进,则按以下顺序探索周围环境:NW,N,NE,E,SE,S,SW(W缺失因为如果它是黑色的话,它将被上一步选中。您可以通过线扫描找到起始像素(这将使您到达E方向,或者在反向扫描的情况下到达W方向)。

    您还应该计算轮廓的长度(以步长为单位)。如果它比你想象的要短得多,你应该丢弃它并再次尝试,直到找到“真正的”轮廓。