检测图像阵列中的各个图像

时间:2015-06-14 09:16:08

标签: algorithm image-processing

我正在建造一个摄影胶片扫描仪。电子硬件现在完成我必须完成机械推进机制,然后我差不多完成了。

我使用线扫描传感器,因此它的一个像素宽度为2000高度。我将使用FTDI FIFO桥通过USB发送到PC的数据流将只是像素的1个字节值。扫描仪将穿过整个36帧的条带,因此我将最终扫描整个条带。一开始我愿意在Photoshop中手动拆分它们但是我想在我的程序中实现一些东西来为我做这件事。我在VS中使用C ++。因此,基本上我需要找到一种方法让PC检测胶片上图像之间的近黑条,隔离图像并将它们保存为单独的文件。

有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:2)

与您已经实施的内容相比,这听起来很简单;你可以

  1. 计算每行的平均像素值,并调用结果信号s(n)n为行号。)
  2. 设置s(n)的阈值,将低于该阈值的所有内容设置为0,将上述所有内容设置为1
  3. 假设您不知道黑条和底片的确切像素高度,请在s(n)中搜索周期。我在下面描述的是完全矫枉过正,但这就是我如何滚动:
    1. 使用FFTw计算s(n)的离散傅立叶变换,称之为S(f)f为频率,即1 /周期)。
    2. 找到argmax(abs(S(f))); f表示两个黑条之间的距离:number of rows / f是条形距离。
    3. S(f)很复杂,因而有争议; arctan(imag(S(f_max))/real(S(f_max)))*number of rows将为您提供酒吧的位置。
  4. 要计算条形的宽度,您可以对abs(S(f))的第二个最高峰进行相同的操作,但它可能更容易计算计算中心位置周围的平均长度0黑条。
  5. 要获得图像条的精确宽度,只取图像边框所在的像素:r_left(x)将是表示实际图像可能与胶片材质边界的几个像素的信号, x是该行的坐标。现在,使用简单的高通滤波器(例如f(x):= r_left(x)-r_left(x-1))来找到该区域中最清晰的边缘(argmax(abs(f(x))))。使用这些边的平均值作为边界位置。
  6. 顺便说一下,如果你想写一个以扫描图像为输入并输出像素行向量流的源块,使用GNU Radio会为你提供一个很好的方法来获得连接信号处理块的流程图这完全符合您的要求,无需您关心从A到B的数据。

    我忘了添加:使用openCV之类的结果坐标,或任何其他能够读取图像并按坐标指定子图像以及保存到新图像的库。