资源简介
图像运动模糊与去运动模糊的opencv实现,linux版本实现,含函数实现,测试代码,与测试demo,结果
代码片段和文件信息
/*--------------------------- motion blur and demotion blur --------------------------------*/
// 此代码用于实现模糊运动的添加与消除。
// 原理:在已知模糊运动核的前提下,可通过核线性卷积的形式对图像添加运动模糊,
// 反之也可利用该核精确的去除该运动模糊。
// 说明:本例代码是在梳理前人代码的基础上整理得到,仅使用了C++常用库与opencv2.4.5
// AddMotionblur的createLinearFilter函数在opencv3+版本中已经去除,故而建议只用opencv2+
// ker 核的大小不能过大,例如,以lena图为例,ker的len为20时,会导致无法复原。
// Input:
// 彩色三通道图像,在读取时转化为灰度图
// output:
// 添加运动模糊的单通道灰度图,或去除运动模糊后的单通道灰度图
// version: 1.0
// date: 2018/6/6
// by xie qunyi
// 转载请注明:
/*------------------------------------------------------------------------------------------*/
#include
#include
using namespace std;
using namespace cv;
// Create an image of complex number type (2 channels to store
// real part and imaginary part) from an input grayscale image
// src : single channel grayscale image input
// dst : two channel complex image output
void i2z(cv::Mat src cv::Mat& dst)
{
//convert the image to float type create another one filled with zeros
//and make an array of these 2 images
cv::Mat im_array[] = { cv::Mat_(src) cv::Mat::zeros(src.size() CV_32F) };
//combine as a 2 channel image to represent a complex number type image
cv::Mat im_complex; cv::merge(im_array 2 im_complex);
//copy to destination
im_complex.copyTo(dst);
}
// convert a 2 channel complex image to a single channel grayscale image
// by getting magnitude
// src : two channel complex image input
// dst : single channel grayscale image output
void z2i(cv::Mat src cv::Mat& dst)
{
//split the complex image to 2
cv::Mat im_tmp[2]; cv::split(src im_tmp);
//get absolute value
cv::Mat im_f; cv::magnitude(im_tmp[0] im_tmp[1] im_f);
//copy to destination
im_f.copyTo(dst);
}
// return complex image C = A./B
// if A = a+b*i and B = c+d*i;
// then C = A./B = ((a*c+b*d)/(c^2+d^2))+((b*c-a*d)/(c^2+d^2))*i
cv::Mat complexDiv(const cv::Mat& A const cv::Mat& B)
{
cv::Mat A_tmp[2]; cv::split(A A_tmp);
cv::Mat a b;
A_tmp[0].copyTo(a);
A_tmp[1].copyTo(b);
cv::Mat B_tmp[2]; cv::split(B B_tmp);
cv::Mat c d;
B_tmp[0].copyTo(c);
B_tmp[1].copyTo(d);
cv::Mat C_tmp[2];
cv::Mat g = (c.mul(c)+d.mul(d));
C_tmp[0] = (a.mul(c)+b.mul(d))/g;
C_tmp[1] = (b.mul(c)-a.mul(d))/g;
cv::Mat C;
cv::merge(C_tmp 2 C);
return C;
}
// add motion blur to the src image
// motion degree is depended on the kernel ker
// ker can be product by matlab func : fspecial
// matlab code : {LEN = 3; THETA = 0; ker = fspecial(‘motion‘ LEN THETA);}
cv::Mat AddMotionblur(const cv::Mat& src const cv::Mat& ker)
{
// convert to float data
cv::Mat sample_float;
src.convertTo(sample_float CV_32FC1);
// motion blur
cv::Point anchor(0 0);
double delta = 0;
cv::Mat dst = cv::Mat(sample_float.size() sample_float.type());
Ptr fe = cv::createLinearFilter(sample_float.type() ker.typ
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-06-06 10:54 demotion
文件 61764 2018-06-06 10:54 demotion
文件 558 2018-06-06 10:54 demotion
文件 72440 2018-06-06 10:54 demotion
文件 45323 2018-06-06 10:54 demotion
文件 4966 2018-06-06 10:54 demotion
相关资源
- process monitor.vi 进程监视器
- HOOK API源码 (OPENPROCESS)
- ImageJ用户手册中文版
- ImageProcessor
- processing画五角星点击画五角星
- IMAGE Transmitter 2宾得联机拍摄软件安装
- processing二维温度场
- CImage类打开和保存jpeg、bmp、gif和png格
- 进程cpu占用率和内存使用大小获取
- delphi TImage 增加支持 png 图片格式 TP
- Visual.Micro.Processing.Sketch
- miniImagenet_download百度云链接
- Introduction to Stochastic Processes 随机过程
-
VC 中使用ba
se64编解码图片 -
gsnap.tar.gz linux从fr
amebuffer获取image源 - Image2lcd2.9以及注册码
-
Efficient Graph-ba
sed Image Segmentation & - Keras Applications模块各网络对比——基
- OpenCV中cvvImage的头文件和源代码
- 音符图像自动识别播放
- PIL中文手册
- 行人检测常用数据库
- Image2LCD OLED图片取模软件
- SAR图像变化检测方法,包括了对数比
- 使用Processing+Arduino写的类似雷达扫描
- X64 inline hook CreateProcessInternalW
- HookCreateProcess
- processing 写的theme river 数据可视化效果
- ImageList加载BMP在ListCtrl中显示的Demo
- VGG_imagenet.npy
评论
共有 条评论