前言
前些天帮一个学长做图像降噪,首先想到的是利用MPI和中值滤波对图像进行处理(因为之前在github上闲逛的时候貌似见过这东西)。
然而这种方法效果并不好,还有和很多限制(比如只能处理pgm灰度图),所以就往opencv的方向考虑了。
MPI及中值滤波
这种方法的效果图找不到了,我们只需要要知道,这样的处理效果远不及预期就对了。
Opencv
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,轻量、高效,总之就是肥肠的好用。
人家的官网安装opencv
在官网上下载opencv最新的windows发行版下载exe文件。很不幸的是,它的发行版是在github上的,如果下载的太慢,可以用我上传到onedrive上的发行版(github源文件,无任何修改)。我的onedrive分享。
下载完可以验证一下哈希值bff38466091c313dac21a0b73eea8278316a89c1d434c6f0b10697e087670168。然后直接安装就行。
配置环境变量
最后检验是否安装成功:
在cmd里输入opencv_version,若输出为版本号,即安装成功。
1 | C:\Users\33167>opencv_version |
Visual Studio里相关配置
opencv图像降噪
opencv高斯模糊
这应该是最简单暴力的降噪方式了……
1 |
|
非常的简单,核心部分就是应用高斯模糊的部分:
1 | cv::GaussianBlur(input_image, output_image, cv::Size(5, 5), 0); |
为了让效果更加明显,可以增大高斯核,从原来的5x5改成25x25:
1 | cv::GaussianBlur(input_image, output_image, cv::Size(25, 25), 0); |
高斯模糊虽然能有效的降低图像的噪点,但会抹去大量的原图细节。
如果要做到平衡降噪和图片清晰度,单纯的高斯模糊显然不是最优解。
opencv中值滤波
依旧是中值滤波,只不过这次换成了通过opencv来进行这个操作而已。
1 |
|
其中的核心是cv中值滤波函数
1 | void medianFilter(cv::Mat& input, cv::Mat& output) { |
中值滤波总体而言表现还不错。
opencv双边滤波
……懒得放图了,反正这个效果是最好的。
基于opencv的运动检测
代码如下:
1 |
|
上述代码实现了简单的运动检测功能,能将运动物体的轮廓在另一个窗口中显示出来。
其中VideoCapture cap(0);调用的是电脑自带的默认摄像头,如果希望使用usb摄像头,可以改为VideoCapture cap(1)或者VideoCapture cap(2).















可以发现,3x3的中值滤波和原图几乎没有区别,将其改成9x9的中值滤波效果更加明显:

Comments