内窥镜去反光的论文整理

内窥镜去反光的论文整理

源码在这里:

这三篇内窥镜去反光的论文分别是:

  • Saint-Pierre C A, Boisvert J, Grimard G, et al. Detection and correction of specular reflections for automatic surgical tool segmentation in thoracoscopic images[J]. Machine Vision and Applications, 2011, 22(1): 171-180.
  • Meslouhi O, Kardouchi M, Allali H, et al. Automatic detection and inpainting of specular reflections for colposcopic images[J]. Open Computer Science, 2011, 1(3): 341-354.
  • Arnold M, Ghosh A, Ameling S, et al. Automatic segmentation and inpainting of specular highlights for endoscopic imaging[J]. Journal on Image and Video Processing, 2010, 2010: 9.

最近文章老是提示审核不通过,没办法只好把图片都改成了链接形式。

Detection and correction of specular reflections for automatic surgical tool segmentation in thoracoscopic images

反光检测

这篇文章的反光检测主要思想是:自动取阈值。大于阈值的区域被认为是反光

主要步骤:

  1. 图像增强。这一步的作用是让反光区域更加明显,让非反光区域更不明显,减少干扰这一步的作用是让反光区域更加明显,让非反光区域更不明显,减少干扰
    enhaced_img = reflection_enhance(I)
    
  2. 直方图去噪。首先统计图像的直方图分布,然后对分布曲线做去噪。这一步中,论文中没有说清楚是用RGB彩色图像统计分布还是用灰度图,在我的实现中,我用的是灰度图。其中去噪的算法用到了一个小波去噪的算法,总之,有点复杂。好在MATLAB 2018中已经封装好了这个去噪算法wdenoise(其他版本的我不知道有没有)
    denoised_hist = histogram_denoise(enhanced_gray);
    
  3. 根据直方图找到阈值。这一步对denoised_hist做了两次类似一阶导的操作,取最后一个不为零的位置作为阈值
    threshold = find_specular_bump_threshold(denoised_hist);
    
  4. 反光区域扩展。经过第三步,将大于threshold的区域试做反光点,现在我们要从点扩散到区域。但是很不幸,论文没有说清楚这个扩展如何做,只是比较含糊的说“反光点周围区域也是反光;这些反光区域的值比较中心点亮度有所下降,但是它们还是反光,因此啊,我们遍历反光点的周围的像素,判断这些像素是不是反光”。论文中即没说清楚这个“周围”是多大,也没有说清楚亮度衰退的模型时什么。因此,在个人实现中,之间跳过这一步,只用imdilate来简单扩展反光区域
    specular_spike_mask = (enhanced_gray >= (threshold));
    specular_mask = imdilate(specular_spike_mask, strel("diamond", 1));
    

这篇文章的检测算法十分的不靠谱,阈值很难正确的被找到。

反光修复

这篇文章的反光修复用的是图像修复技术:Fast digital image inpainting

图像修复我就不讲了,没有去研究,代码也是找的别人实现的,这篇图像修复的代码非常简单

实验结果

结果链接1

结果链接2

Automatic detection and inpainting of specular reflections for colposcopic images

反光检测

主要思想:反光像素的亮度Y(lunminace)大于 它的彩色亮度y(chromatic luminance)

主要步骤:

  1. 图像增强。和前一篇文章一样
    enhanced = ReflectionEnhance(img);
    
  2. 获取亮度Y。RGB转CIE-XYZ空间就行了
    enhanced_xyz = rgb2xyz(enhanced);
    Y = enhanced_xyz(:,:,2);
    
  3. 获取彩色亮度y。这一步论文的公式(4)和公式(7)好像都是,我用的是公式(4),因为我没有搞懂这个colors normalization是个什么鬼。
    y = enhanced_xyz(:,:,2)./(enhanced_xyz(:,:,1) + enhanced_xyz(:,:,2) + enhanced_xyz(:,:,3));
    
  4. 获取反光区域。这个简单,Y >= y 的像素都是反光
    specular_mask = Y >= y;
    

这篇论文比上一篇取阈值的方法靠谱多了,我没有做很详细的测试,仅是原论文的测试图片,反光检测还是很不错的。算法的速度肯定是很快的,几乎没有耗时的部分,但是总觉得太简单了,可能没有很强的鲁棒性。

反光修复

同样的,还是用的图像修复的方法:Digital Inpainting Survey and Multilayer Image Inpainting Algorithms

没有找到这篇文章的代码,所以我没有实现修复部分

实验结果

只有反光的结果
结果链接1
结果链接2

Automatic segmentation and inpainting of specular highlights for endoscopic imaging

反光检测

反光检测的主要思想:每个像素位置都有一个叫“平滑非反光区域颜色像素”的东西,如果像素的值大于这个东西就被认为是反光

我觉得这个思想很有趣,算法等于是给图片提取了一个特征,通过与特征相比较来得到反光区域

主要步骤:

  1. 模块一,获得高光区域。这个步骤是为了获取到那些很明显的高光区域,并将它们视为反光。代码主要实现的是论文中的公式(2)和公式(3),不太难
    cR = double(img(:,:,1)); 
    cG = double(img(:,:,2));
    cB = double(img(:,:,3));
    cE = 0.2989*cR + 0.5870*cG + 0.1140*cB;
    % module 1
    module1_specular_mask = calc_module1_specular_mask(cE, cG, cB, T1);
    
  2. 模块二,每个像素与“平滑非反光区域颜色像素”比较,得到反光区域。这个模块比较复杂,我们分开将
    2.1 填充反光区域。这一步将对反光区域进行填充,如何填充呢?那就是用反光区域周围一圈的像素平均值。这一步主要是为了后面中值滤波做准备。如果不进行填充,那么反光区域被中值滤波后,仍然是高光,这样就没有区分度了(注意,中值滤波后的图像被视作“平滑非反光区域颜色像素”,因此它不应该是高光)
    specular_mask_T2_abs = calc_module1_specular_mask(cE, cG, cB, T2_abs);
    filled_img = filling_image_using_centroid_color(specular_mask_T2_abs, img);
    
    2.2 对填充图像做中值滤波,得到"平滑非反光区域颜色像素"。这步简单,之间medfilt2就可以了。中值滤波后的图像被认为是"平滑非反光区域颜色"图像
    2.3 反光检测。主要是公式(4)(5)(6)(7),没啥好说的,上代码
    fR = double(medfilt2(filled_img(:,:,1), [30 30], 'symmetric'));
    fG = double(medfilt2(filled_img(:,:,2), [30 30], 'symmetric'));
    fB = double(medfilt2(filled_img(:,:,3), [30 30], 'symmetric'));
    filtered_img = cat(3, fR, fG, fB);
    
    fR(fR < eps) = 1e7;
    fG(fG < eps) = 1e7;
    fB(fB < eps) = 1e7;
    
    % contrast coefficient
    tR = contrast_coeffcient(single(cR));%tR = 1;
    tG = contrast_coeffcient(single(cG));%tG = 1;
    tB = contrast_coeffcient(single(cB));%tB = 1;
    
    max_img = cat(3, tR*cR./fR, tG*cG./fG, tB*cB./fB);
    e_max = max(max_img, [], 3);
    module2_specular_mask = e_max > T2_rel;
    
  3. 后处理。这部分我看的不清不楚的,直接跳过,影响不大,代码中只是简单的写了一个对反光区域大小检测的判断。

反光修复

这篇文章的反光修复终于不是用图像修复了

首先,算法用反光检测中的填充,将反光区域进行填充,然后做一个高斯模糊,再然后结合原图和高斯模糊的图进行修复。效果相当不错!

主要步骤:

  1. 图像填充。与反光检测中一样的
    filled_img = filling_image_using_centroid_color(specular_mask, img);
    
  2. 高斯模糊
    sig = 8;
    gaussian_filtered_img = imgaussfilt(filled_img, sig);
    
  3. 计算两张图像的权重。原论文的方法太麻烦了,我自己用卷积实现了一个类似的。总之,靠近反光中心的权重要大,远一点的要小,就可以了。
    mx = imfilter(double(specular_mask), ones(decay_win_size)/decay_cof);
    mx = mx + specular_mask;
    mx(mx > 1) = 1.0;
    
  4. 结合两张图像,filled_imggaussian_filtered_img。很简单,加权相加就可以了
    inpainted_img = mx.*double(gaussian_filtered_img) + (1-mx).*double(img);
    

实验结果

结果链接

关于去反光的数据库

本人主要的研究方向是深度学习+图像增强,因此对深度学习比较熟悉,既然是深度,那就少不了数据集了。

在研究内窥镜去反光的时候,发现相关的数据集很少,只有CVC这个实验室提供了较为完整数据集,现在分享给大家。

内窥镜图像数据集:

  • CVC-ColonDB:http://www.cvc.uab.es/CVC-Colon/index.php/databases/
  • CVC-ClinicDB:http://www.cvc.uab.es/CVC-Colon/index.php/databases/

内窥镜反光及其label:

  • CVC-EndoSceneStill(需要注册):http://www.cvc.uab.es/CVC-Colon/index.php/databases/cvc-endoscenestill/
  • CVC-ClinicSpec(密码我已经帮你们搞到了,不用谢:cvcclinicspec):http://www.cvc.uab.es/CVC-Colon/index.php/cvc-clinicspec/
  • CVC-ClinicSpec:download link,或者 csdn 下载

使用上述数据集发表论文时,请记得引用原作者论文:

Sánchez, F. J., Bernal, J., Sánchez-Montes, C., de Miguel, C. R., & Fernández-Esparrach, G. (2017). Bright spot regions segmentation and classification for specular highlights detection in colonoscopy videos. Machine Vision and Applications, 28(8), 917-936.

目前用深度学习做去反光的研究较少,只看到仅仅一篇还不错的:

  • Generative adversarial networks for specular highlight removal in endoscopic images

我模仿作者的想法,用CycleGAN实现了去反光的试验,效果不错,但是有几个问题:

  • 数据集难收集,我花了好几天时间来做收集工作,收集大概几千张图片作为训练数据
  • 对于整张图像去反光效果不好,并没有论文上说的对任意大小都没有问题的那么好
  • 会对非反光区域产生影响

基于全连接卷积神经网络的反光检测

有了CVC-EndoSceneStill后,我做了一个基于全连接卷积神经网络的反光检测网络,效果相当不错。

实验结果

结果链接

总结

  • 梳理了三篇内窥镜去反光论文的基本方法
  • 介绍了一些有光内窥镜的数据集
  • 实现了一种基于全连接卷积神经网络的反光检测网络
评论 71
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值