知乎:山与水你和我
个人代码仓库之一, 以传统图像处理和相关算法为主(浅尝辄止),主要语言 C++,日后有空会陆续更新一些经典、有趣的算法。
涉及以下内容:
- colorization: 着色
- compression: 图像压缩
- deblur: 去模糊
- dehaze: 去雾
- denoise: 去噪
- detection: 检测
- editing: 编辑
- fusion: 融合
- filter: 滤波器
- geometry: 几何
- HDR: 高动态范围
- inpainting: 修复
- interpolation: 插值、采样
- low-light: 暗光增强
- matting: 抠图
- optical flow: 光流
- quality: 质量评测
- super resolution:超分辨
- OpenCV 4.5.5
- GCC 10.3.0(C++17)
- Python 3.7
- CUDA >=10.1(可选)
- CMake 3.17
- XMake 2.7.4(可选)
- Eigen3 3.3.9(可选)
通常构建方式是
# Windows + CMake + MinGW
cmake .. -G "MinGW"
mingw32-make
# Linux + CMake + gcc
cmake ..
make
# Windows + XMake + MinGW
xmake g --mingw=PATH_OF_MINGW
xmake f -p mingw
xmake build
xmake run
# Windows + XMake + MSVC
xmake
xmake build
xmake run
(2004 SIGGRAPH)Colorization using Optimization paper code
基于涂鸦的自动着色
输入 | mark | 结果 |
waiting
waiting
-
(2009 CVPR)Single Image Haze Removal Using Dark Channel Prior code 知乎
何恺明大名鼎鼎的暗通道先验去雾,2009 CVPR best paper
无雾场景 有雾场景 输入 结果 代码中包含了暗通道先验验证、guided filter 精细化等内容。
-
(2015 TIP)A Fast Single Image Haze Removal Algorithm Using Color Attenuation Prior code
基于颜色衰减先验的去雾算法,使用机器学习估计参数
颜色衰减先验
去雾流程
输入 深度图 暗通道 引导滤波 最远点 结果
去噪算法
-
(1990 TPAMI)Scale-space and edge detection using anisotropic diffusion code 知乎
anisotropic_diffusion 各向异性滤波
输入 结果 -
gaussian filter 高斯滤波 code
后续将出优化专篇。
输入 结果 -
bilateral filter 双边滤波 code
提供 CPU/CUDA 实现,日后出优化专篇。
输入 结果 -
(2006 ECCV)A Fast Approximation of the Bilateral Filter using a Signal Processing Approach code
bilateral filter using grid 网格加速双边滤波,目前参考官方实现,日后出 CUDA 版本。
输入 结果 -
(2005)A non-local algorithm for image denoising code
non local means 滤波,提供 CPU/CUDA 实现。后续出优化专篇,其中涉及快速均值滤波。
输入 结果 -
(2010 ECCV)Guided Image Filtering code 知乎
何恺明大佬的经典之作,引导滤波(导向滤波),将引导图的高频以线性加权的方式叠加到输入图的低频上,可以完成去噪等多项任务,也可以将其归纳到 filter 那一章节中。
目前只提供了 CPU 上的 C++ 简单实现,由于涉及快速均值滤波暂无高性能实现;同时 Fast Guided Filtering 也在计划之中。
(1)去噪(线性时间复杂度!保边滤波!)
输入 输出 (2)细化权重(如抠图)
掩码 引导图 输出 类似地,引导滤波还可以用于细化权重图边缘,如在暗通道先验去雾中细化透射率图。
(3)细节增强
输入 bilateral filter guided filter 更多应用查看原论文。
-
(1986)A Computational Approach to Edge Detection code 知乎 Canny 边缘检测算法。
输入 结果 -
(1988)A combined corner and edge detector code 知乎
Harris 角点检测算法。
输入 结果 -
(1)边缘检测。
输入 结果 (2)LOG(Laplacian of Gaussian)检测特征点
输入 边缘 NMS 特征点 -
(1983)A Multiresolution Spline with Application to Image Mosaics code 知乎
Laplace Pyramid 拉普拉斯金字塔。
(1)图像压缩
输入 压缩 (2)图像融合
左图 右图 掩码 结果 -
(2004 IJCV)Distinctive Image Featuresfrom Scale-Invariant Keypoints code 知乎
sift 尺度不变特征变换匹配算法!
在 CNN 火以前,计算机视觉中 SOTA 的图像特征提取器,分为两个阶段——特征检测 + 特征描述,提取的特征具有尺度不变性、旋转不变性、亮度不变性等。
这里只实现了第一阶段,利用 LOG 金字塔检测特征点,正确性尚未验证。后续有空会更新后续的特征点描述,并封装成一个接口(CPU/CUDA)。
输入 结果 -
(1997 IJCV)SUSAN: A New Approach to Low Level Image Processing code 知乎
SUSAN,比较有意思的一个图像处理算子,可以处理包括角点检测、边缘检测、去噪等。
(1)角点检测
输入 输出 (2)边缘检测
输入 输出 (3)去噪
输入 输出
-
(2003 SIGGRAPH)Poisson Image Editing code 知乎
泊松编辑(泊松融合),非常经典的文章,基于梯度域做图像编辑、图像融合!
目前提供 C++ 实现。
背景 前景 掩码 直接粘贴 初步结果 梯度混合 更多的应用包括纹理交换、局部纹理消除、局部纹理抹平、局部色彩变幻、局部动态范围压缩等,详情见论文和我的 知乎。
这里会记录一些就基础、特殊的滤波器,提供 CPU 实现,有空尽力添加 CPU 加速实现和 CUDA 实现。
-
输入 输出 最值滤波提供多种实现,测试图像分辨率 2832 x 4256,滤波直径 81,只测试局部邻域最小值,i5-10400f 单核单线程,C++ 开 O2 优化,结果如下
运行时间 时间复杂度 空间复杂度 时间复杂度 暴力 65.141 s O(H * W * k * k) O(1) 拆分 1.656 s O(H * W * k) O(HW) 单调队列 0.672 s O(HW) O(max(H, W) + k) 动态规划 0.391 s O(HW) O(max(H, W)) -
均值滤波 code
实现方式有盒子滤波、积分图,在引导滤波、人像美颜中都多有应用,在计划中。
几何。这部分比较难,是计算机视觉三大问题之一。个人准备在这模块学习一些多视角变换、相机标定等知识,应用的话如一些 RACSAC、stitching 算法等等。
waiting
- 二维旋转 code
这部分东西也比较多,资料不好找。目前先实现一些简单的 HDR,动态范围压缩。
waiting
-
最近邻 、bilinear 、bicubic code 知乎
目前只实现了 bilinear 和 bicubic 的 CPU 版本实现(为加速),后续会推出加速篇(CPU 优化和 CUDA 优化版本)
(1)bilinear
512x341 2400x1600 200x140 (2)bicubic
512x341 1800x1200 300x200 -
(2007 TOG)Joint Bilateral Upsampling code 知乎
联合双边上采样算法。
这部分写了一版光流上采样的代码,但是效果不太好,后续有空再 debug。上采样算法不适合做光流,后续有空改成深度图试试。
低分辨率光流 引导图 高分辨率光流
-
(2011 SIGGRAPH)Fast efficient algorithm for enhancement of low lighting video code 知乎
比较有创新的算法,对低光照图像的反转图像做去雾,再取反即可。
输入 输出 反转图像 去雾图像 类似,可以对有雾图像取反,做低光照增强,再取反得到去雾图像,结果好坏很大程序上取决于去雾算法的好坏。
有雾图像 暗通道 增强结果 去雾结果 -
histogram_equalization 直方图均衡 code
直方图均衡算法,比较简单,可以增大图像的对比度,根据累积概率分布重构图像像素分布,增大动态范围。
-
多尺度基于 Retinex 的图像增强算法
输入 SSR MSR MSRCR
-
A Bayesian Approach to Digital Matting code 知乎
目前提供 Linux 下的 C++ 实现,在 Windows 上使用 Eigen3 求解方程会死循环。在我电脑上(i5-10400f),单线程 0.48s 处理一张 640x480 的图像。
输入 trimap alpha
测试图像来源
@inproceedings{bychkovsky2011learning,
title={Learning photographic global tonal adjustment with a database of input/output image pairs},
author={Bychkovsky, Vladimir and Paris, Sylvain and Chan, Eric and Durand, Fr{\'e}do},
booktitle={CVPR 2011},
pages={97--104},
year={2011},
organization={IEEE}
}