OpenCV的滚动球背景减法算法
在ImageJ:Process->Subtract background中是否有OpenCV(android)实现的“滚动球”背景减法算法 OpenCV有一个BackgroundSubtractorMOG类,但它用于视频流,而不是单个独立图像 这是该方法的一个示例:OpenCV的滚动球背景减法算法,opencv,image-processing,computer-vision,Opencv,Image Processing,Computer Vision,在ImageJ:Process->Subtract background中是否有OpenCV(android)实现的“滚动球”背景减法算法 OpenCV有一个BackgroundSubtractorMOG类,但它用于视频流,而不是单个独立图像 这是该方法的一个示例: 以下是该过程的文档:据我所知,OpenCV C库中没有实现,Android JNI包装器只是围绕主库的包装器 已经说过ImageJ实现的源代码可以在线获得,因此您应该能够将其直接整合到Android图像处理管道中 关于滚动球与使用
以下是该过程的文档:据我所知,OpenCV C库中没有实现,Android JNI包装器只是围绕主库的包装器 已经说过ImageJ实现的源代码可以在线获得,因此您应该能够将其直接整合到Android图像处理管道中 关于滚动球与使用圆盘结构元素(可在OpenCV中获得)的相对优点,进行了一些讨论
如果你绝对需要滚动球和OpenCV,那么遗憾的是它是不可用的。“< /P> < P> <强>编辑:< /强>在使用此帖子中的方法之前,请阅读下面的评论,也可以考虑@ ReNAT和@ David Hoffman的答案。
以防有人仍在寻找python中的滚动球背景校正。对我来说,以下几点效果很好将scipy.ndimage导入为scim
从scipy.misc导入imsave
从skimage.com导入球
#读取图像
im=scim.imread(“路径”)[:,:,0].astype(int)
#创建半径为50、直径为2*50+1的三维球
s=球(50)
#只拿球的上半部分
h=s.shape[1]//2+1#50+1
#将三维球展平为加权二维圆盘
s=s[:h,:,:]和(轴=0)
#将权重重缩放为0-255
s=(255*(s-s.min())/(s.max()-s.min())
#使用im打开(im,球)(即白色顶帽变换)(见原始出版物)
im_corr=scim.white_tophat(im,结构=s)
#保存校正后的图像
imsave('outfile',im_corr)
这将提供与imagej实现不完全相同的结果,但结果非常相似。在我的例子中,有更好和更差的校正区域。此外,整体颜色强度更高。基于@Xenthor的答案,我得出了以下结论:
将numpy导入为np
将scipy.ndi图像导入为ndi
从scipy.ndimage.\u不支持导入\u规范化\u序列
def滚动球过滤器(数据、球半径、间距=无、顶部=假、**kwargs):
用形态学运算实现的滚动球滤波器
这种植入非常类似于ImageJ中的植入,并使用顶帽变换
具有球形结构元素
https://en.wikipedia.org/wiki/Top-hat_transform
参数
----------
数据:Ndaray
图像数据(假定位于规则网格上)
球半径:浮动
要滚动的球的半径
间距:int或sequence
图像数据的间距
上图:布尔
是在数据的顶部还是底部滚动球
kwargs:关键词参数
这些将传递给ndimage形态学操作
退换商品
-------
数据\u nb:ndarray
减去背景的数据
bg:Ndaray
从数据中减去的背景
"""
ndim=data.ndim
如果间距为“无”:
间距=1
间距=_规范化_序列(间距,ndim)
半径=np.asarray(_归一化_序列(球半径,ndim))
mesh=np.array(np.meshgrid(*[np.arange(-r,r+s,s)表示拉链中的r,s(半径,间距)],index=“ij”))
结构=2*np.sqrt(1-((网格/半径.整形(-1,*((1,)*ndim))**2.sum(0))
结构[~np.isfinite(结构)]=0
如果不是顶部:
#ndi.white_tophat(数据,结构=结构,输出=背景)
背景=ndi.灰色(数据,结构=结构,**kwargs)
背景=ndi.grey\u膨胀(背景,结构=结构,**kwargs)
其他:
#ndi.black_tophat(数据,结构=结构,输出=背景)
背景=ndi.grey\u膨胀(数据,结构=结构,**kwargs)
背景=ndi.灰色\u侵蚀(背景,结构=结构,**kwargs)
返回数据-背景,背景
您可以在这里找到opencv中最近的滚动球实现
总之
安装pip安装opencv滚动球
范例
import cv2
from cv2_rolling_ball import subtract_background_rolling_ball
img = cv2.imread(f'path/to/img.tif', 0)
img, background = subtract_background_rolling_ball(img, 30, light_background=True, use_paraboloid=False, do_presmooth=True)
ImageJ实现的原始算法来自1983年的一篇论文。我看了一下,它实际上是一顶灰度形态的白色礼帽,带有一个球形的灰度结构元素(参见)。在ImageJ实现(此处提供)中,根据结构元素的半径对图像进行下采样,然后将图像上采样到原始分辨率,默认情况下,在计算要减去的背景之前应用使用3x3平均滤波器的平滑操作。这很可能解释了使用Xenthor提出的方法观察到的差异 如果你在Android上工作,你有几个选择:1)使用ImageJ库,因为它是Java的,但是你需要实现一个OpenCV ImageJ图像桥;2)如果你使用Android NDK在C++中工作,并且由于OpenCV不为非平坦的结构元素实现灰度形态,那么你可以使用ITK()代替Grayale白色顶帽;3)仍然使用NDK,这里有一个基于OpenCV的C++端口,这里的算法仍然是一个正在进行中的工作。
从浏览导入数据,恢复
image=data.coins()
背景=恢复。滚动球(图像)
结果=图像-背景
感谢您的贡献,在中提供了更详细的演练,但这是否有效?我不得不改变
间距=np