【opencv】25.图像卷积cv::filter2D()以及c++代码实例
自己写图像锐化函数:
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>using namespace std;
using namespace cv;void Sharpen(const Mat& myImage, Mat& Result);int main()
{Mat srcImage = imread("1.png");//判断图像是否加载成功if(srcImage.data)cout << "图像加载成功!" << endl << endl;else{cout << "图像加载失败!" << endl << endl;return -1;}namedWindow("srcImage", WINDOW_AUTOSIZE);imshow("srcImage", srcImage);Mat dstImage;dstImage.create(srcImage.size(), srcImage.type());Sharpen(srcImage, dstImage);namedWindow("dstImage",WINDOW_AUTOSIZE);imshow("dstImage",dstImage);waitKey(0);return 0;
}void Sharpen(const Mat& myImage, Mat& Result)
{CV_Assert(myImage.depth() == CV_8U); //判断函数CV_Assertconst int nChannels = myImage.channels();for(int j = 1; j < myImage.rows - 1; ++j){const uchar* precious = myImage.ptr<uchar>(j - 1); //当前像素上一行指针const uchar* current = myImage.ptr<uchar>(j); //当前像素行指针const uchar* next = myImage.ptr<uchar>(j + 1); //当前像素下一行指针uchar* output = Result.ptr<uchar>(j);//利用公式和上下左右四个像素对当前像素值进行处理for(int i = nChannels; i < nChannels * (myImage.cols - 1); ++i){// 0, -1 ,0; -1, 5, -1; 0, -1, 0;*output++ = saturate_cast<uchar>(5 * current[i] -current[i-nChannels]-current[i+nChannels]-precious[i]-next[i]);}}Result.row(0).setTo(Scalar(0)); //设置第一行所有元素值为0Result.row(Result.rows-1).setTo(Scalar(0)); //设置最后一行所有元素值为0Result.col(0).setTo(Scalar(0)); //设置第一列所有元素值为0Result.col(Result.cols-1).setTo(Scalar(0)); //设置最后一列所有元素值为0
}
上面代码是以卷积核为[0−10−15−10−10]\begin{bmatrix} 0&-1&0\\ -1&5&-1 \\ 0&-1&0 \end{bmatrix}⎣⎡0−10−15−10−10⎦⎤为例的锐化
,结果图就是轻微的锐化,这里不做展示。
图像卷积运算API函数: cv::filter2D()
举例: 直接使用边缘检测的拉普拉斯算子API函数,与自己定义拉普拉斯算子核使用cv::filter2D()
的效果对比:
#include <iostream>
#include <string>
#include <vector>#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
// g++ test.cpp `pkg-config opencv --libs --cflags` -std=c++11 -pthread -o testusing namespace std;
using namespace cv;const int Kenel_s = 3; //卷积核大小int main() {//读入图片Mat src, dst, dst_L;src = imread("1.png", 0);// copyMakeBorder(src, src, Kenel_s - 1, Kenel_s - 1, Kenel_s - 1, Kenel_s -// 1, BORDER_CONSTANT, Scalar(0)); //填充图像imshow("Image of src", src);dst = src.clone();cv::Laplacian(dst, dst, dst.depth());imshow("Image of Laplacian API", dst);// cv::Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);// cv::Mat kernel = (Mat_<char>(3, 3) << -1, -1, -1, -1, 8, -1, -1, -1, -1);cv::Mat kernel = (Mat_<char>(3, 3) << 1, 1, 1, 1, -8, 1, 1, 1, 1);cv::filter2D(src, src, CV_8UC3, kernel);imshow("Image of Laplacian 2", src);while (waitKey(0) != 'q') {};return 0;
}
origin:
API:
cv::filter2D():
【opencv】25.图像卷积cv::filter2D()以及c++代码实例相关推荐
- 【python+opencv】图像卷积及滤波
目录 1.噪声的分类 2.图像卷积 2.1单次卷积操作 2.2对整幅图像卷积 2.3完整卷积过程 3.opencv中的卷积-filter2D函数 4.卷积中的padding填充(边界填充) 5.pad ...
- OpenCV实现图像对齐ECC算法(附完整代码)
OpenCV实现图像对齐ECC算法 OpenCV实现图像对齐ECC算法 OpenCV实现图像对齐ECC算法 #include <opencv2/imgcodecs.hpp> #includ ...
- Ros下使用OpenCV对图像进行处理
Ros中的图像信息是sensor_msgs/Image的格式,而OpenCV 中图像是cv:Mat格式.所以从Ros中获取的图像不能直接用OpenCV进行处理,需要进行格式转化.还好,Ros中提供了进 ...
- java 图片旋转 翻转 镜像处理_Java OpenCV实现图像镜像翻转效果
本文实例为大家分享了Java OpenCV实现图像镜像翻转效果的具体代码,供大家参考,具体内容如下 主要使用OpenCV的flip()方法,可以实现图像的垂直.水平以及同时垂直镜像翻转. flip是C ...
- Java垂直镜像,Java OpenCV实现图像镜像翻转效果
本文实例为大家分享了Java OpenCV实现图像镜像翻转效果的具体代码,供大家参考,具体内容如下 主要使用OpenCV的flip()方法,可以实现图像的垂直.水平以及同时垂直镜像翻转. flip是C ...
- 8.openCV 裁剪图像
8.openCV 裁剪图像 一.使用 OpenCV 裁剪图像 二.项目结构和代码讲解 1.项目结构 2.代码讲解 三.代码下载 一.使用 OpenCV 裁剪图像 在本教程的第一部分,我们将讨论如何将 ...
- java图片镜像代码_Java OpenCV实现图像镜像翻转效果
本文实例为大家分享了Java OpenCV实现图像镜像翻转效果的具体代码,供大家参考,具体内容如下 主要使用OpenCV的flip()方法,可以实现图像的垂直.水平以及同时垂直镜像翻转. flip是C ...
- matlab作卷积的公式,卷积相关公式的matlab代码
取半径=3 用matlab代码实现上式公式: length=3; for Ki = 1:length for Kj = 1:length for Kk = 1:length Ksigma(Ki,Kj, ...
- OpenCV学习笔记(十)——图像卷积(cv.filter2D()、矩阵旋转cv.filp())
目录 1 图像卷积过程 2 cv.filter2D() 3 cv.filp() 卷积运算在信号处理中十分常见,而图像信息可以看成一种信号.例如,图像的每一行可以看出测量亮度变化的信号,而每一列可以看作 ...
最新文章
- 已知小红今年12岁c语言编程,C语言程序设计第轮复习习题.doc
- 如何利用云原生技术构建现代化应用?
- PostgreSQL学习笔记8之索引
- Array.prototype.slice.call 将伪数组转成真数组的原理是什么?
- php5.3降5.2,php5.3降级为5.2
- 小屏旗舰新王者: 三星Galaxy S11e曝光
- python 并发编程目录
- matlab 病态方程组,数值分析(Hilbert矩阵)病态线性方程组的求解Matlab程序
- 持续集成部署Jenkins工作笔记0016---测试验证整个自动化持续集成流程
- el表达式 多条件判断
- Unity AnimatorController 混合树 状态机 骨骼
- CZMDUI,简约而不简单的typecho模板
- selenium自动化购买火车票+存储数据库
- 计算两条线或多边形的交点(LineString | MultiLineString | Polygon )
- Java学习路线-20:正则表达式
- 2020计算机分数线,成都计算机电子信息学校2020年招生录取分数线
- k8s(四)—service服务(暴露方式:ClusterIP、NodePort、LoadBalancer、ExternalName、ingress)
- QT 安装 配置过程
- MATLAB复原动态模糊图像
- 在群晖中批量删除重复文件
热门文章
- 运满满的技术架构演进之路
- selenium打开chrome浏览器代码
- STOMP协议规范--转载
- 解决 ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)异常
- 《Credit Risk Scorecard》第四章:Data Review and Project Parameters
- 中科院罗平演讲全文:自动撰写金融文档如何实现,用 AI 解救“金融民工” | CCF-GAIR 2017
- 乐视姓孙还是姓贾?反正我不知道
- 汤晓鸥谈深度学习三大核心要素:算法设计、高性能的计算能力以及大数据
- 用gdb调试core dump文件
- Java Review - ArrayList 源码解读