文章目录
- 内窥镜去反光的论文整理
- Detection and correction of specular reflections for automatic surgical tool segmentation in thoracoscopic images
- Automatic detection and inpainting of specular reflections for colposcopic images
- Automatic segmentation and inpainting of specular highlights for endoscopic imaging
- 关于去反光的数据库
- 基于全连接卷积神经网络的反光检测
- 总结
内窥镜去反光的论文整理
源码在这里:
- https://github.com/jiemojiemo/some_specular_detection_and_inpainting_methods_for_endoscope_image
- https://github.com/jiemojiemo/FCN_Specular_Detection
这三篇内窥镜去反光的论文分别是:
- 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
反光检测
这篇文章的反光检测主要思想是:自动取阈值。大于阈值的区域被认为是反光
主要步骤:
- 图像增强。这一步的作用是让反光区域更加明显,让非反光区域更不明显,减少干扰这一步的作用是让反光区域更加明显,让非反光区域更不明显,减少干扰
enhaced_img = reflection_enhance(I)
- 直方图去噪。首先统计图像的直方图分布,然后对分布曲线做去噪。这一步中,论文中没有说清楚是用RGB彩色图像统计分布还是用灰度图,在我的实现中,我用的是灰度图。其中去噪的算法用到了一个小波去噪的算法,总之,有点复杂。好在MATLAB 2018中已经封装好了这个去噪算法wdenoise(其他版本的我不知道有没有)
denoised_hist = histogram_denoise(enhanced_gray);
- 根据直方图找到阈值。这一步对
denoised_hist
做了两次类似一阶导的操作,取最后一个不为零的位置作为阈值threshold = find_specular_bump_threshold(denoised_hist);
- 反光区域扩展。经过第三步,将大于
threshold
的区域试做反光点,现在我们要从点扩散到区域。但是很不幸,论文没有说清楚这个扩展如何做,只是比较含糊的说“反光点周围区域也是反光;这些反光区域的值比较中心点亮度有所下降,但是它们还是反光,因此啊,我们遍历反光点的周围的像素,判断这些像素是不是反光”。论文中即没说清楚这个“周围”是多大,也没有说清楚亮度衰退的模型时什么。因此,在个人实现中,之间跳过这一步,只用imdilate
来简单扩展反光区域specular_spike_mask = (enhanced_gray >= (threshold)); specular_mask = imdilate(specular_spike_mask, strel("diamond", 1));
这篇文章的检测算法十分的不靠谱,阈值很难正确的被找到。
反光修复
这篇文章的反光修复用的是图像修复技术:Fast digital image inpainting
图像修复我就不讲了,没有去研究,代码也是找的别人实现的,这篇图像修复的代码非常简单
实验结果
Automatic detection and inpainting of specular reflections for colposcopic images
反光检测
主要思想:反光像素的亮度Y(lunminace)大于 它的彩色亮度y(chromatic luminance)
主要步骤:
- 图像增强。和前一篇文章一样
enhanced = ReflectionEnhance(img);
- 获取亮度Y。RGB转CIE-XYZ空间就行了
enhanced_xyz = rgb2xyz(enhanced); Y = enhanced_xyz(:,:,2);
- 获取彩色亮度y。这一步论文的公式(4)和公式(7)好像都是,我用的是公式(4),因为我没有搞懂这个colors normalization是个什么鬼。
y = enhanced_xyz(:,:,2)./(enhanced_xyz(:,:,1) + enhanced_xyz(:,:,2) + enhanced_xyz(:,:,3));
- 获取反光区域。这个简单,Y >= y 的像素都是反光
specular_mask = Y >= y;
这篇论文比上一篇取阈值的方法靠谱多了,我没有做很详细的测试,仅是原论文的测试图片,反光检测还是很不错的。算法的速度肯定是很快的,几乎没有耗时的部分,但是总觉得太简单了,可能没有很强的鲁棒性。
反光修复
同样的,还是用的图像修复的方法:Digital Inpainting Survey and Multilayer Image Inpainting Algorithms
没有找到这篇文章的代码,所以我没有实现修复部分
实验结果
Automatic segmentation and inpainting of specular highlights for endoscopic imaging
反光检测
反光检测的主要思想:每个像素位置都有一个叫“平滑非反光区域颜色像素”的东西,如果像素的值大于这个东西就被认为是反光
我觉得这个思想很有趣,算法等于是给图片提取了一个特征,通过与特征相比较来得到反光区域
主要步骤:
- 模块一,获得高光区域。这个步骤是为了获取到那些很明显的高光区域,并将它们视为反光。代码主要实现的是论文中的公式(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.1 填充反光区域。这一步将对反光区域进行填充,如何填充呢?那就是用反光区域周围一圈的像素平均值。这一步主要是为了后面中值滤波做准备。如果不进行填充,那么反光区域被中值滤波后,仍然是高光,这样就没有区分度了(注意,中值滤波后的图像被视作“平滑非反光区域颜色像素”,因此它不应该是高光)
2.2 对填充图像做中值滤波,得到"平滑非反光区域颜色像素"。这步简单,之间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);
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;
- 后处理。这部分我看的不清不楚的,直接跳过,影响不大,代码中只是简单的写了一个对反光区域大小检测的判断。
反光修复
这篇文章的反光修复终于不是用图像修复了
首先,算法用反光检测中的填充,将反光区域进行填充,然后做一个高斯模糊,再然后结合原图和高斯模糊的图进行修复。效果相当不错!
主要步骤:
- 图像填充。与反光检测中一样的
filled_img = filling_image_using_centroid_color(specular_mask, img);
- 高斯模糊
sig = 8; gaussian_filtered_img = imgaussfilt(filled_img, sig);
- 计算两张图像的权重。原论文的方法太麻烦了,我自己用卷积实现了一个类似的。总之,靠近反光中心的权重要大,远一点的要小,就可以了。
mx = imfilter(double(specular_mask), ones(decay_win_size)/decay_cof); mx = mx + specular_mask; mx(mx > 1) = 1.0;
- 结合两张图像,
filled_img
和gaussian_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后,我做了一个基于全连接卷积神经网络的反光检测网络,效果相当不错。
实验结果
总结
- 梳理了三篇内窥镜去反光论文的基本方法
- 介绍了一些有光内窥镜的数据集
- 实现了一种基于全连接卷积神经网络的反光检测网络