Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV的滚动球背景减法算法_Opencv_Image Processing_Computer Vision - Fatal编程技术网

OpenCV的滚动球背景减法算法

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图像处理管道中 关于滚动球与使用

在ImageJ:Process->Subtract background中是否有OpenCV(android)实现的“滚动球”背景减法算法

OpenCV有一个BackgroundSubtractorMOG类,但它用于视频流,而不是单个独立图像

这是该方法的一个示例:


以下是该过程的文档:

据我所知,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