检测图像数组中的单个图像
Detecting individual images in an array of images
我正在制作胶片扫描仪。电子硬件现在已经完成,我必须完成机械推进机制,然后我就快完成了。
我使用的是线扫描传感器,所以它是一个像素宽度乘以 2000 像素高度。我将使用 FTDI FIFO 桥通过 USB 发送到 PC 的数据流将只是像素的 1 字节值。扫描仪将拉过一整条 36 帧,所以我将扫描整个条带。一开始我愿意在 Photoshop 中手动拆分它们,但我想在我的程序中实现一些东西来为我做这件事。我在 VS 中使用 C++。所以,基本上我需要找到一种方法让 PC 检测胶片图像之间的近乎黑色的条纹,隔离图像并将它们保存为单独的文件。
有人可以给我一些建议吗?
与您已经实施的内容相比,这听起来很简单;你可以
- 计算每行的平均像素值,并将生成的信号称为
s(n)
(n
是行号)。
- 为
s(n)
设置一个阈值,将低于该阈值的所有值设置为 0,将高于该阈值的所有值设置为 1
- 假设您不知道黑条和底片的确切像素高度,请在
s(n)
中搜索周期性。我在下面描述的是完全矫枉过正,但这就是我的方式:
- 使用FFTw计算
s(n)
的离散傅立叶变换,称之为S(f)
(f
是频率,即1/period)。
- 找到
argmax(abs(S(f)))
; f
表示两个黑条之间的距离: number of rows
/ f
是条距离。
S(f)
是复数,因此有一个参数; arctan(imag(S(f_max))/real(S(f_max)))*number of rows
将为您提供条形图的位置。
- 要计算条形的宽度,您可以对
abs(S(f))
的第二高峰执行相同的操作,但只计算计算中心位置周围 0 的平均长度可能会更容易的黑条。
- 要获得图像条的确切宽度,只取图像边界可能位于的像素:
r_left(x)
将是代表实际图像可能与胶片边界的少数像素的信号material,x
是沿该行的坐标)。现在,使用简单的高通滤波器(例如 f(x):= r_left(x)-r_left(x-1)
)找到该区域(argmax(abs(f(x)))
)中最锐利的边缘。使用这些边缘的平均值作为边界位置。
顺便说一句,如果你想编写一个源代码块,将你的扫描图像作为输入并输出像素行向量流,使用 GNU Radio 将为你提供一个获得连接信号流程图的好方法处理完全按照您的要求执行的块,而无需关心从 A 到 B 的数据获取。
我忘了补充:将生成的坐标与 openCV 或任何其他能够读取图像并通过坐标指定子图像以及保存到新图像的库一起使用。
我正在制作胶片扫描仪。电子硬件现在已经完成,我必须完成机械推进机制,然后我就快完成了。
我使用的是线扫描传感器,所以它是一个像素宽度乘以 2000 像素高度。我将使用 FTDI FIFO 桥通过 USB 发送到 PC 的数据流将只是像素的 1 字节值。扫描仪将拉过一整条 36 帧,所以我将扫描整个条带。一开始我愿意在 Photoshop 中手动拆分它们,但我想在我的程序中实现一些东西来为我做这件事。我在 VS 中使用 C++。所以,基本上我需要找到一种方法让 PC 检测胶片图像之间的近乎黑色的条纹,隔离图像并将它们保存为单独的文件。
有人可以给我一些建议吗?
与您已经实施的内容相比,这听起来很简单;你可以
- 计算每行的平均像素值,并将生成的信号称为
s(n)
(n
是行号)。 - 为
s(n)
设置一个阈值,将低于该阈值的所有值设置为 0,将高于该阈值的所有值设置为 1 - 假设您不知道黑条和底片的确切像素高度,请在
s(n)
中搜索周期性。我在下面描述的是完全矫枉过正,但这就是我的方式:- 使用FFTw计算
s(n)
的离散傅立叶变换,称之为S(f)
(f
是频率,即1/period)。 - 找到
argmax(abs(S(f)))
;f
表示两个黑条之间的距离:number of rows
/f
是条距离。 S(f)
是复数,因此有一个参数;arctan(imag(S(f_max))/real(S(f_max)))*number of rows
将为您提供条形图的位置。
- 使用FFTw计算
- 要计算条形的宽度,您可以对
abs(S(f))
的第二高峰执行相同的操作,但只计算计算中心位置周围 0 的平均长度可能会更容易的黑条。 - 要获得图像条的确切宽度,只取图像边界可能位于的像素:
r_left(x)
将是代表实际图像可能与胶片边界的少数像素的信号material,x
是沿该行的坐标)。现在,使用简单的高通滤波器(例如f(x):= r_left(x)-r_left(x-1)
)找到该区域(argmax(abs(f(x)))
)中最锐利的边缘。使用这些边缘的平均值作为边界位置。
顺便说一句,如果你想编写一个源代码块,将你的扫描图像作为输入并输出像素行向量流,使用 GNU Radio 将为你提供一个获得连接信号流程图的好方法处理完全按照您的要求执行的块,而无需关心从 A 到 B 的数据获取。
我忘了补充:将生成的坐标与 openCV 或任何其他能够读取图像并通过坐标指定子图像以及保存到新图像的库一起使用。