2

我有一张图片,我想旋转这张图片,就像这样:旋转必须是自动的。另一方面,必须计算旋转角度。

[1 - 图片]

在此处输入图像描述

在 openCV 上进行这种旋转有什么想法吗?

我怎样才能在这张图片上提取一个小矩形?像这样:(我用红色标记了一些区域)

[2 - 图片]

在此处输入图像描述

有什么想法可以从 OpenCV 上的这个图像中提取这个区域吗?

4

1 回答 1

2

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

要回答您的第一个问题:

如果您的图像都与您提供的图像相似,您可以这样做(这些不一定是顺序步骤,它们编号只是为了便于参考):

  1. 转换为黑白(如果您愿意,您可以仅在概念上执行此操作,通过将像素值与阈值进行比较,如下所示)

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

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

  4. 从当前点的坐标和N点的坐标往后退,计算if或mandq的and ,并制作4个直方图,分辨率为你需要的
    y = m x + qabs(Δx) ≤ abs(Δy)m'q'x = m' y + q'

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

  6. 找到 , , 和 的最大值,和m,在去除 和 的最大值的周围后,和的另外 2 个 (局部) 最大值; 这些将是您对矩形 4 条边界线方程的参数的估计,其中(取决于您可以使用的最终结果,或,例如)m'qq'qq'qq'm ≅ -m'mm'(m-m')/2

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

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

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

于 2013-07-13T20:34:15.427 回答