一、滤波器实现

我们实现这样一个基于拉普拉斯算子的滤波器核心,并使用它进行滤波,这可以做到锐化图像的效果,

0 -1 0
-1 5 -1
0 -1 0

首先我们完全手动的进行滤波,依赖指针操作,

void sharpen(const cv::Mat &image, cv::Mat &result) {
result.create(image.size(), image.type());
std::cout << image.size() << std::endl;
int col = image.cols;
int row = image.rows;
int channels = image.channels(); for (int i = 1; i < row - 1; i++ ) {
// 必须添加const,因为image是const的
const uchar* previous_row = image.ptr<uchar>(i - 1);
const uchar* current_row = image.ptr<uchar>(i);
const uchar* next_row = image.ptr<uchar>(i + 1); uchar* out_line = result.ptr<uchar>(i);
for (int j = channels; j < (col - 1)*channels; j++) {
// cv::saturate_cast<uchar>将输入截断在0到255
*out_line++ = cv::saturate_cast<uchar>(
5 * current_row[j] - current_row[j - channels] - current_row[j + channels]
- previous_row[j] - next_row[j]);
}
}
result.row(0).setTo(cv::Scalar(0,0,0));
result.row(row - 1).setTo(cv::Scalar(0, 0, 0));
result.col(0).setTo(cv::Scalar(0, 0, 0));
result.col(col - 1).setTo(cv::Scalar(0,0,0));
}

OpenCV提供了cv::filter2D函数,当我们指定滤波核(一个Mat格式数据)可以自动代我们完成循环过程,依赖API实现本函数如下:

void sharpen2D(const cv::Mat image, cv::Mat &result) {
cv::Mat kernel(3, 3, CV_32F, cv::Scalar(0));
kernel.at<float>(1, 1) = 5;
kernel.at<float>(0, 1) = -1;
kernel.at<float>(1, 0) = -1;
kernel.at<float>(2, 1) = -1;
kernel.at<float>(1, 2) = -1;
cv::filter2D(image, result, image.depth(), kernel);
}

对两个版本函数都进行调用,

	cv::Mat image = cv::imread("test.jpg");
std::cout << (int)image.data << std::endl; // 自行锐化滤波
cv::Mat image1;
sharpen(image, image1);
show(image1, "锐化");
cv::Mat image2;
sharpen2D(image, image2);
show(image2, "API锐化");

查看输出(可右键查看大图),

原图如下:

二、高斯滤波

OpenCV将大部分常用滤波函数进行封装,资料很多,自行查阅。其中高斯核函数多提一句,它是可拆分核函数,一个二维核可以拆解为两个一维核,我们既可以这样调用:

cv::GaussianBlur(
image,
result,
cv::Size(5, 5), // 窗口大小
1.5 // sigma
);

也可以这样调用,

cv::Mat gauss = cv::getGaussianKernel(5, 1.5, CV_32F);
cv::sepFilter2D(image, result, -1, gauss, gauss); // -1代表输入图深度
cv::imshow("双一维高斯滤波", result);

结果一样,

『OpenCV3』滤波器实现及使用滤波器降噪的更多相关文章

  1. 『OpenCV3』滤波器边缘检测

    一.原理简介 边缘检测原理 - Sobel, Laplace, Canny算子 X方向Sobel算子 -1 -2 -1 0 0 0 1 2 1 Y方向Sobel算子 -1 0 1 -2 0 2 -1 ...

  2. 『OpenCV3』Harris角点特征_API调用及python手动实现

    一.OpenCV接口调用示意 介绍了OpenCV3中提取图像角点特征的函数: # coding=utf- import cv2 import numpy as np '''Harris算法角点特征提取 ...

  3. 『OpenCV3』霍夫变换原理及实现

    霍夫变换常用于检测直线特征,经扩展后的霍夫变换也可以检测其他简单的图像结构. 在霍夫变换中我们常用公式 ρ = x*cosθ + y*sinθ 表示直线,其中ρ是圆的半径(也可以理解为原点到直线的距离 ...

  4. 『OpenCV3』基于色彩分割图片

    一.遍历图像实现色彩掩码 本节我们实现这样一个算法,我们指定某种颜色和一个阈值,根据输入图片生成一张掩码,标记符合的像素(和指定颜色的差异在阈值容忍内). 源代码如下,我们使用一个class完成这个目 ...

  5. 『OpenCV3』Mat简介

    Mat属性方法介绍:OpenCV2:Mat属性type,depth,step 推荐一套OpenCV入门博客:OpenCV探索 一.Mat Mat类用于表示一个多维的单通道或者多通道的稠密数组.能够用来 ...

  6. 『OpenCV3』处理视频&摄像头

    在opencv中,摄像头和视频文件并没有很大不同,都是一个可以read的数据源,使用cv2.VideoCapture(path).read()可以获取(flag,当前帧),对于每一帧,使用图片处理函数 ...

  7. 『OpenCV3』简单图片处理

    cv2和numpy深度契合,其图片读入后就是numpy.array,只不过dtype比较不常用而已,支持全部数组方法 数组既图片 import numpy as np import cv2 img = ...

  8. 『AngularJS』$location 服务

    项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...

  9. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

随机推荐

  1. 深度学习基础(三)NIN_Network In Network

    该论文提出了一种新颖的深度网络结构,称为"Network In Network"(NIN),以增强模型对感受野内local patches的辨别能力.与传统的CNNs相比,NIN主 ...

  2. 15.0-uC/OS-III资源管理

    1.共享资源可以是:变量(静态的或全局的).结构体.内存空间. I/O等. 多个任务可能会同时要求占用资源: 内存空间. 全局变量. 指针.缓冲区. 列表. 环形缓冲区等. 通过共享资源, 任务间通信 ...

  3. spring和springboot

    Spring四大原则: 1.使用POJO进行轻量级和最小侵入式开发 2.通过依赖注入和基于接口编程实现松耦合 3,.通过AOP和默认习惯进行声明式编程 4.使用AOP和模版template减少模式化代 ...

  4. WebSocket 学习教程(二):Spring websocket实现消息推送

    =============================================== 环境介绍: Jdk 1.7 (1.6不支持) Tomcat7.0.52 (支持Websocket协议) ...

  5. Mac破解免费office软件

    一.下载安装包及破解工具 地址: https://pan.baidu.com/s/1hugtoLQ 密码: s5in 附官网地址 文件夹中包含三个文件: Office16安装文件 Microsoft_ ...

  6. Oracle 11.2.0.4 RAC重建EM案例

    环境:Oracle 11.2.0.4 RAC 重建EM 背景:客户之前的EM已经被损坏,需要重建EM 重建EM的方案有很多,其中最简单的方法是:直接使用emca重建,oracle用户下,只需一条命令搞 ...

  7. apache多站点vhost.conf配置

    #第1个站点的配置 <VirtualHost *:80> DocumentRoot "D:/phpStudy/WWW" ServerName localhost < ...

  8. Django框架详细介绍---request对象

    几个重要的函数 1.HttpRequest.get_host() 根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False和 HTTP_H ...

  9. QT中显示gif图片方法

    movie = new QMovie(":/timg.gif"); movie->setScaledSize(QSize(,)); ui->giflabel->s ...

  10. 创建servlet程序知识点详解---servlet-day05

    jdbc.properties怎么写? 把秘密改为自己电脑设置的 password url 3306 是安装mysql时所确定的端口  后面还可以接字符集的限定 #1 jsp是什么?(java ser ...