如何实现快速的 OpenCV 均匀性检测图像处理算法?
Posted
技术标签:
【中文标题】如何实现快速的 OpenCV 均匀性检测图像处理算法?【英文标题】:How do I achieve a fast OpenCV uniformity detection image processing algorithm? 【发布时间】:2014-09-17 23:58:21 【问题描述】:我想要一个图像处理函数,如果它周围的所有像素(比如 +/- 4)具有几乎相同的 RGB 值(在某个阈值内:epsilon),它会为每个像素返回 1。否则,在像素位置返回零。
我用get()
和put()
写了这个,用Java API,扫过整个图像矩阵,但是很慢。
我是否可以使用一些策略来利用现有的 OpenCV 图像处理功能来实现相同的结果但速度更快?
【问题讨论】:
【参考方案1】:opencv 中的Inrange() 函数呢?我想它会满足你的条件。
【讨论】:
我正在尝试检测具有相对恒定值的表面,但我不一定提前知道该值。【参考方案2】:就实现的和众所周知的功能而言,这是一个算法问题,而不是语言问题。尝试使用 A 的初始图像(矩阵)r 通道:
calc Amin -- 对 A 进行窗口化(窗口半大小 = 4)最小操作的结果,称为“侵蚀” 计算 Asub-min = A - Amin 阈值 Asub-min 通过 epsilon ( if(Asub_ij 对 max 函数做同样的事情(“膨胀”) Ares = Asub-min-thr AND Asub-max-thr -- Ares 是一个通道的答案 对所有频道执行相同操作 Ares-rgb = Ares-r AND Ares-g AND Ares-b -- 你的最终答案。以上所有功能都是well implementedin openCV,包括GPU加速(GPU并不总是可以从Java访问)。不再需要 get() 和 put()!
如果您不需要每个通道的 epsilon-distance 而是 RGB 中的 L2 距离,您将不得不进行更多计算,例如 Asub-rgb^2 = Asub-r*Asub-r + Asub-g*Asub-g + Asub- b*Asub-b 然后是 epsilon^2 阈值,但对于 3 维 RGB 空间,每通道 epsilon 与 L2-epsilon 的差异仅在于 worst 情况下的因子 sqrt(3),因此您可以忽略它并进行快速计算。
【讨论】:
以上是关于如何实现快速的 OpenCV 均匀性检测图像处理算法?的主要内容,如果未能解决你的问题,请参考以下文章
从一组图像中检测明显不同的图像,例如使用 OpenCV 或 SimpleCV