[C++/OpenCV] 数字图像处理:使用OpenCV实现基于L0范数的梯度最小化图像平滑滤波及完整源代码

本文介绍了如何用C++和OpenCV实现基于L0范数梯度最小化的图像平滑滤波。作者参照了'Image Smoothing via L0 Gradient Minimization'的研究,并提供了适用于RGB图像的代码实现,目前不支持灰度图像。虽然未经优化,代码仍能有效运行,处理速度相比MATLAB稍慢,但对小图像影响较小。文章附带头文件和源文件,读者可以通过电子邮件908665750@qq.com与作者交流。
摘要由CSDN通过智能技术生成

本文使用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矩阵
* 参数:
*	
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值