OpenCVSharp 4.5 去离焦模糊
用OpenCVSharp 4.5 跑一遍 OpenCV 官方教程
原官方教程链接:OpenCV: Out-of-focus Deblur Filter
using System;
using OpenCvSharp;namespace ConsoleApp1
{class tutorial30 : ITutorial{public void Run(){int R = 6 ; //计算PSF参数:R(半径)double snr = 500; //维纳滤波器参数Mat imgIn = Cv2.ImRead("I:\\csharp\\images\\original.jpg", ImreadModes.Grayscale);if (imgIn.Empty()) //check whether the image is loaded or not{Console.WriteLine("ERROR : Image cannot be loaded..!!");return;}Mat imgOut = new Mat();// it needs to process even image onlyRect roi = new Rect(0, 0, imgIn.Cols & -2, imgIn.Rows & -2);//Hw calculation (start)Mat Hw = new Mat();Mat h = new Mat();calcPSF(out h, roi.Size, R);calcWnrFilter(h, out Hw, 1.0 / snr);//Hw calculation (stop)// filtering (start)filter2DFreq( imgIn[roi], out imgOut, Hw);// filtering (stop)imgOut.ConvertTo(imgOut, MatType.CV_8U);Cv2.Normalize(imgOut, imgOut, 0, 255, NormTypes.MinMax);Cv2.ImShow("result.jpg", imgOut);Cv2.WaitKey();}private void calcPSF(out Mat outputImg, Size filterSize, int R){Mat h = Mat.Zeros(filterSize, MatType.CV_32F);Point point = new Point(filterSize.Width / 2, filterSize.Height / 2);Cv2.Circle(h, point.X, point.Y, R, 255, -1, LineTypes.Link8);Scalar summa = Cv2.Sum(h);outputImg = h / summa[0];}private void filter2DFreq(Mat inputImg, out Mat outputImg, Mat H){inputImg.Clone().ConvertTo(inputImg,MatType.CV_32F);Mat[] planes = { inputImg, Mat.Zeros(inputImg.Size(), MatType.CV_32F) };Mat complexI = new Mat();Cv2.Merge(planes, complexI);Cv2.Dft(complexI, complexI, DftFlags.Scale);H.Clone().ConvertTo(H, MatType.CV_32F);Mat[] planesH = { H, Mat.Zeros(H.Size(), MatType.CV_32F) };Mat complexH = new Mat();Cv2.Merge(planesH, complexH);Mat complexIH = new Mat();Cv2.MulSpectrums(complexI, complexH, complexIH, 0);Cv2.Idft(complexIH, complexIH);Cv2.Split(complexIH, out planes);outputImg = planes[0];}private void fftshift(Mat inputImg, out Mat outputImg){outputImg = inputImg.Clone();int cx = outputImg.Cols / 2;int cy = outputImg.Rows / 2;Mat q0 = new Mat(outputImg, new Rect(0, 0, cx, cy));Mat q1 = new Mat(outputImg, new Rect(cx, 0, cx, cy));Mat q2 = new Mat(outputImg, new Rect(0, cy, cx, cy));Mat q3 = new Mat(outputImg, new Rect(cx, cy, cx, cy));Mat tmp = new Mat();q0.CopyTo(tmp);q3.CopyTo(q0);tmp.CopyTo(q3);q1.CopyTo(tmp);q2.CopyTo(q1);tmp.CopyTo(q2);}private void calcWnrFilter(Mat input_h_PSF, out Mat output_G, double nsr){Mat h_PSF_shifted = new Mat();fftshift(input_h_PSF, out h_PSF_shifted);Mat[] planes = { h_PSF_shifted.Clone(), Mat.Zeros(h_PSF_shifted.Size(), MatType.CV_32F) };Mat complexI = new Mat();Cv2.Merge(planes, complexI);Cv2.Dft(complexI, complexI);Cv2.Split(complexI, out planes);Mat denom = new Mat();Cv2.Pow(Cv2.Abs(planes[0]), 2, denom);denom += nsr;Mat output = new Mat();Cv2.Divide(planes[0], denom, output);output_G = output;}}
}
最后效果与参数设置关系很大!多试验
OpenCVSharp 4.5 去离焦模糊相关推荐
- 基于MATLAB的离焦模糊图像复原
基于MATLAB的离焦模糊图像复原 摘 要 图像在获取.传输和存储过程中会受到如模糊.失真.噪声等原因的影响,这些原因会使图像的质量下降.因此,我们需要采取一定的方法尽可能地减少或消除图像质量的下降, ...
- 《一周学完光线追踪》学习 十一点五 离焦模糊代码原理分析
蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术 首先分析一下生成随机Ray的程序: vec3 random_in_unit_disk() {vec3 p;do {p = 2.0*vec3(rand ...
- TOF双频去距离模糊原理
1. TOF距离模糊现象及原因 Continuous-Wave TOF (CW-TOF)法通过测量发射波与接收波的相位差来计算距离.假设相位差为phi, 调制频率为fm, 则距离值计算为: d = c ...
- 图像处理之仿真运动模糊复原【使用逆滤波、维纳滤波】
目录 一.基础知识 二.问题分析 三.效果图 四.代码 一.基础知识 图像去模糊是一个经典的图像复原任务.造成图像模糊的原因有很多,可以主要分为三大类 离焦模糊:场景中的物体处于成像景深范围之外而变得 ...
- android 滑动模糊渐变,Android UI效果实现 滑动模糊渐变效果实现
大家应该都看到过iOS7解锁屏幕的滑动模糊渐变效果,好了,现在可以把手纸收起来了,今天黄老师就给大家讲一下如何在Android平台上 实现类似的滑动模糊渐变效果,其实方式远比你想像的简单. 目标效果展 ...
- cad模糊查询符号_万能模糊查询SQL
****************************************************************** * 功能:万能模糊查询SQL * 时间:2015/1/30 16: ...
- [转载]模糊系统:挑战与机遇并存——十年研究之感悟 王立新
[转载]模糊系统:挑战与机遇并存--十年研究之感悟 王立新 http://www.ee.ust.hk/ece.php http://www.ee.ust.hk/~eewang/ 模糊系统:挑战与机遇并 ...
- 图像运动模糊及其去除
Introduction 图像去模糊是一个经典的图像复原任务.造成图像模糊的原因有很多,可以主要分为三大类 离焦模糊:场景中的物体处于成像景深范围之外而变得模糊.离焦模糊的去除一般对应着景深的扩展技术 ...
- 模糊图像的倒谱matlab,基于倒谱分析方法的离焦模糊图像特征鉴别
基于倒谱分析方法的离焦模糊图像特征鉴别 [摘要]在图像拍摄记录的过程中,图像捕获系统因各种原因常常不能精确成像,故而极易产生模糊图像,离焦模糊是常见的模糊图像之一.本文重点介绍了一种倒谱分析方法,在倒 ...
最新文章
- 【Luogu P2764】最小路径覆盖问题
- laravel中单独获取一个错误信息的方法
- tornado函数和类的导入和ui_modules , ui_methods
- Web开发的那点事--业务层常用功能
- linux nacos启动_Nacos集群安装配置
- 可视化工具Navicat for MySQL-操作三
- dabs是什么意思_cpdd是什么意思(网络语cpdd是什么梗啥意思)
- Dom4j工具--XML的DOM解析(下)--写操作
- Atom飞行手册翻译: 3.6 图标
- linux php 中文乱码解决,Linux中文乱码如何解决
- 在Anylogic建立自己的智能体
- 做个简单的Java学生考勤系统04--签到功能的开发
- 识别“百度权重”作弊的方法
- 怎样用计算机筛选,教您Excel中筛选功能怎么用
- java对七牛云文件的增删改查语句_七牛云导播
- 从零开始学习Java设计模式 | 软件设计原则篇:依赖倒转原则
- JQuery中$(document)和$(window)是什么意思,有什么作用
- 远程计算机云电脑,教你一招 手机免费变云电脑可以玩PC云游戏
- NOIp2016 题解
- RISC领域ARM不是唯一