前言

这是一个图像去模糊的小demo,用OpenCV实现。

代码:

#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2\highgui.hpp"using namespace cv;
using namespace std;int r = 10;
int snr = 60;void deblur(cv::Mat &src, cv::Mat &dst, int r, int snr);
void calcPSF(Mat& outputImg, Size filterSize, int R);
void fftshift(const Mat& inputImg, Mat& outputImg);
void filter2DFreq(const Mat& inputImg, Mat& outputImg, const Mat& H);
void calcWnrFilter(const Mat& input_h_PSF, Mat& output_G, double nsr);int main(void)
{Mat src = imread("222.jpeg");namedWindow("原图", 0);cv::imshow("原图", src);cv::Mat dst;deblur(src, dst, r, snr);namedWindow("去模糊:", 0);imshow("去模糊:", dst);waitKey(0);return 0;
}void deblur(cv::Mat &src, cv::Mat &dst, int r, int snr)
{cv::Mat gray;if (src.data == nullptr){return;}if (src.channels() > 1){cv::cvtColor(src, gray, CV_BGR2GRAY);}Rect roi = Rect(0, 0, gray.cols & -2, gray.rows & -2);Mat Hw, h;calcPSF(h, roi.size(), r);calcWnrFilter(h, Hw, 1.0 / double(snr));filter2DFreq(gray(roi), dst, Hw);dst.convertTo(dst, CV_8U);normalize(dst, dst, 0, 255, NORM_MINMAX);
}void calcPSF(Mat& outputImg, Size filterSize, int R)
{Mat h(filterSize, CV_32F, Scalar(0));Point point(filterSize.width / 2, filterSize.height / 2);circle(h, point, R, 255, -1, 8);Scalar summa = sum(h);outputImg = h / summa[0];
}void fftshift(const Mat& inputImg, Mat& outputImg)
{outputImg = inputImg.clone();int cx = outputImg.cols / 2;int cy = outputImg.rows / 2;Mat q0(outputImg, Rect(0, 0, cx, cy));Mat q1(outputImg, Rect(cx, 0, cx, cy));Mat q2(outputImg, Rect(0, cy, cx, cy));Mat q3(outputImg, Rect(cx, cy, cx, cy));Mat tmp;q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);
}void filter2DFreq(const Mat& inputImg, Mat& outputImg, const Mat& H)
{Mat planes[2] = { Mat_<float>(inputImg.clone()), Mat::zeros(inputImg.size(), CV_32F) };Mat complexI;merge(planes, 2, complexI);dft(complexI, complexI, DFT_SCALE);Mat planesH[2] = { Mat_<float>(H.clone()), Mat::zeros(H.size(), CV_32F) };Mat complexH;merge(planesH, 2, complexH);Mat complexIH;mulSpectrums(complexI, complexH, complexIH, 0);idft(complexIH, complexIH);split(complexIH, planes);outputImg = planes[0];
}
void calcWnrFilter(const Mat& input_h_PSF, Mat& output_G, double nsr)
{Mat h_PSF_shifted;fftshift(input_h_PSF, h_PSF_shifted);Mat planes[2] = { Mat_<float>(h_PSF_shifted.clone()), Mat::zeros(h_PSF_shifted.size(), CV_32F) };Mat complexI;merge(planes, 2, complexI);dft(complexI, complexI);split(complexI, planes);Mat denom;pow(abs(planes[0]), 2, denom);denom += nsr;divide(planes[0], denom, output_G);
}

运行效果:

OpenCV图像处理——修复失焦模糊的图像相关推荐

  1. 【OpenCV图像处理】十五、图像空域滤波(上)

    1.空域滤波介绍 空域滤波是一种邻域处理方法,通过直接在图像空间中对邻域内像素进行处理,达到平滑或锐化图像的作用.此外,在图像识别中,通过滤波还可以抽出图像的特征作为图像识别的特征模式. 空域滤波是图 ...

  2. OpenCV图像处理(12)——保存图像到指定位置

    将一个图像写到硬盘的指定位置,分别输入的是路径的文件夹名称.图像要命名的名字. 需要完善:通过index确定文件格式(如:jpeg.jpg.bmp等)最后一个参数,为返回的整个全路径,显然有问题,至少 ...

  3. 【OpenCV图像处理】十六、图像空域滤波(下)

    空域滤波的后半部分主要讲图像的锐化相关操作. 图像锐化: 由于成像机理和成像设备的限制,尤其是对于一些专用成像设备,如医学成像,遥感成像和视频捕获等等,所成图像可能会变得模糊.图像锐化的作用就是增强图 ...

  4. OpenCV图像处理学习二十,图像直方图均衡化原理与实现

    一.图像直方图的概念 图像直方图,是指对整个图像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图.直方图反映了图像灰度的分布情况,是图像的统计学特征.图像的灰度直方 ...

  5. Python+OpenCV 图像处理系列(9)—— 图像的翻转和缩放插值

    1. 图像的翻转 图像翻转 (Image Flip),图像翻转的本质像素映射,OpenCV 支持三种图像翻转方式: X轴翻转,flipcode = 0 Y轴翻转, flipcode = 1 XY轴翻转 ...

  6. OpenCV 图像处理系列(6)—— 图像的几何变化

    图像的几何变换 OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换.cv2.warpAffine 接收的 ...

  7. Python+OpenCV 图像处理系列(5)—— 图像 ROI 操作及通道的拆分合并

    1. 图像 ROI 有时你需要对一幅图像的特定区域进行操作.例如我们要检测一副图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索.这样会提高程序的准确性和性 ...

  8. Python+OpenCV 图像处理系列(4)—— 图像像素的读写、算术运算、逻辑运算及像素的统计

    1. 像素的读写 可以根据像素的行和列的坐标获取它的像素值.对 BGR 图像而言,返回值为 B,G,R 的值. img.shape 可以获取图像的形状.它的返回值是一个包含行数 h,列数 w,通道数 ...

  9. OpenCV图像处理 空间域图像增强(图像锐化 1 基于拉普拉斯算子)

    http://ggicci.blog.163.com/blog/static/210364096201262123236955/ OpenCV OpenCV 图像锐化 拉普拉斯算子 ( Laplaci ...

最新文章

  1. 【零基础学习iOS开发】【02-C语言】10-函数
  2. [HNOI 2011]数矩形
  3. [转]正确配置Linux系统ulimit值的方法
  4. CTime,Systemtime的比较还有转换成日期格式。
  5. Linux 命令(92)—— locate 命令
  6. web 基本概念辨异 —— URI 与 URL
  7. c# DateTime常用用法
  8. HDU 3790最短路径问题 [最短路最小花费]
  9. Tomcat 7 的七大新特性
  10. Hyperledger Fabric教程(5)-- byfn.sh分析-docker-compose-base.yaml
  11. C++:Trivial、Standard-Layout 和 POD
  12. 工程师结婚还要加班,都是鹿晗干的好事
  13. 软件授权解决方案FlexNet Publisher
  14. 异步下载小说《诡秘之主》
  15. 3点钟无眠区块链:96小时聊天内容精华全记录
  16. 微信小程序中图片压缩的最佳实现与封装
  17. SQL Server 数据库之角色、管理权限
  18. 世界星载SAR发展10——RADAR1(1997,美国)
  19. win10:应用程序无法正常启动(0xc0000142),请单击“确认”关闭程序
  20. apktool,dex2jar,jd-gui简单使用

热门文章

  1. 漫步者蓝牙只有一边有声音_漫步者Dreampods新品体验,蓝牙耳机黑科技来了
  2. 没有mssqlserver的协议_LoadRunner是什么 LoadRunner协议选择原则介绍【图文】
  3. Hough 检测直线
  4. 【死磕Java并发】-----Java内存模型之happens-before
  5. 深入理解JVM(5) : Java垃圾收集器
  6. 設計模式之王 - MVC
  7. Spring的自动装配方法
  8. Java集合容器全面分析
  9. 北上广互联网创业者分布图!
  10. 如何设计一门语言(一)——什么是坑(a)