在ImageJ:Process->Subtract Background中是否有OpenCV(android)实现“rolling ball”背景减除算法?
OpenCV有一个BackgroundSubtractorMOG类,但它用于视频流,而不是单个独立的图像。
下面是该方法的一个示例:https://i.stack.imgur.com/mXSLb.jpg
以下是该过程的文档:http://imagejdocu.tudor.lu/doku.php?id=gui:process:subtract_background
6条答案
按热度按时间c86crjj01#
据我所知,OpenCV C库中没有实现,Android JNI Package 器只是围绕主库的 Package 器。
尽管如此,ImageJ实现的源代码可以在here在线获得,因此您应该能够将其直接纳入Android图像处理管道。
有一些关于滚球与使用磁盘结构元素(在OpenCV中可用)here的相对优点的讨论。
如果你绝对需要Rolling Ball和OpenCV,那么不幸的是,它无法“开箱即用”。
mtb9vblg2#
在opencv中有一个最近的rolling-ball实现,您可以在这里找到
https://pypi.org/project/opencv-rolling-ball/
总之
安装
pip install opencv-rolling-ball
例如
字符串
mrfwxfqh3#
基于@Xenthor的回答,这是我想出来的:
字符串
ih99xse14#
**编辑:**在使用本文中的方法之前,请阅读下面的评论,并考虑@renat和@大卫霍夫曼的答案。
如果有人还在寻找python中的滚动球背景校正。对我来说,下面的工作非常好。
1.加载图像并单独处理每个通道。
1.创建加权球结构元素
1.使用白色礼帽变换
下面是一些单色图像的代码:
字符串
这给你的结果与imagej实现不完全相同,但结果非常相似。在我的例子中,有更好和更差的校正区域。此外,整体颜色强度更高。
but5z9lq5#
ImageJ实现的原始算法来自1983年的一篇论文https://www.computer.org/csdl/magazine/co/1983/01/01654163/13rRUwwJWBB。我看了一下,它实际上是一个带有球形灰度结构元素的灰度形态学白色礼帽(参见https://en.wikipedia.org/wiki/Top-hat_transform)。在ImageJ实现中,(此处可用https://imagej.nih.gov/ij/developer/source/ij/plugin/filter/BackgroundSubtracter.java.html),根据结构元素的半径对图像进行下采样,然后上采样到原始分辨率,默认情况下,在计算要减去的背景之前,应用使用3 × 3均值滤波器的平滑操作。2这可能解释了用Xenthor提出的方法观察到的差异。
如果你在Android上工作,你有几个选择:1)使用ImageJ库,因为它是在Java中,你将需要实现一个OpenCV-ImageJ图像桥; 2)如果你在C中使用Android NDK工作,因为OpenCV不为非平面结构元素实现灰度形态,你可以使用ITK(https://itk.org/)来执行灰度白色礼帽; 3)仍然使用NDK,这里有一个基于OpenCV的算法的C端口:https://github.com/folterj/BioImageOperation/tree/master/BioImageOperation,但它仍然是一个正在进行的工作。
dl5txlt96#
我知道它不是opencv,但在scikit-image(版本≥ 0.18)中有一个实现。
字符串
documentation中提供了更详细的演练