本文使用C++语言和OpenCV实现基于L0范数的梯度最小化图像平滑滤波,具体原理请参考文献:
"Image Smoothing via L0 Gradient Minimization", Li Xu, Cewu Lu, Yi Xu, Jiaya Jia, ACM Transactions on Graphics, (SIGGRAPH Asia 2011), 2011.
文中提供了MATLAB下的源代码,但是为了跨语言和平台使用,本文将其方法使用OpenCV进行了重写。
- 说明:
(1)本文代码的实现环境为:Visual Studio 2015, OpenCV 3.1.0 - 32bit
(2)本文代码仅用于RGB彩色图像,无法用于单通道灰度图像,灰度图像的实现要简单些,如果需要可以对本文代码稍作改动即可,以后有时间我也会补充这个缺陷。
(3)因为比较急用,代码实现没有做细致的优化,处理速度比matlab版的稍慢一点点,但影响不大,小图像的处理时间差距可以忽略不计,本文中的测试图像(1280*720尺寸)处理时间比matlab慢估计1-2秒左右(没有精确计算),如果需要可以自行优化,之后我也会进行优化并更新代码。
(4)本文代码共两个文件,头文件myFunction.h和源文件myFunction.cpp,源代码在下面,只要搭建好OpenCV环境,无须做任何修改可以直接调用函数使用。
- 问题反馈与交流:
邮箱:908665750@qq.com,发邮件即可,我可以收到,请勿加QQ。
- 使用方法(测试代码):
//主程序
#include <iostream>
#include <cstdlib>
#include <opencv2/opencv.hpp>
#include "myFunction.h"
using namespace cv;
using namespace std;
int main()
{
//读取图像,必须是三通道彩色图像
Mat input = imread("f:/temp/image.png");
//滤波
Mat output= L0Smoothing(input); //L0Smoothing即是L0滤波函数
cout << endl;
//显示滤波后图像
imshow("output",output);
waitKey(0);
system("pause");
return 0;
}
- 源代码:
头文件 myFunction.h:
//头文件 myFunction.h
#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
/*****
* 函数名:myInitMatFromArray2d
* 说明:从二维数组中初始化Mat矩阵
* 参数:
* 1.float *t_array:二维数组,t_array[第一维:行数][第二维:列数]
* 2.int t_rows:t_array第一维大小
* 3.int t_cols:t_array第二维大小
* 4.Mat& t_mat:被初始化的Mat矩阵,要求:Mat m_mat(Size(t_cols,t_rows),CV_32F(1))
*****/
void myInitMatFromArray2d(float *t_array, int t_rows, int t_cols, Mat& t_mat);
/*****
* 函数名:myInitMatFromArray3d
* 说明:从三维数组中初始化Mat矩阵
* 参数:
* 1.float *t_array:三维数组,t_array[第一维:通道数][第二维:行数][第三维:列数]
* 2.int t_rows:t_array第二维大小
* 3.int t_cols:t_array第三维大小
* 4.Mat& t_mat:被初始化的Mat矩阵,要求:Mat m_mat(Size(t_cols,t_rows),CV_32F(3))
*****/
void myInitMatFromArray3d(float *t_array, int t_rows, int t_cols, Mat& t_mat);
/*****
* 函数名:myShowMat
* 说明:打印Mat矩阵
* 参数:
*