自己写图像锐化函数:

#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−1​0−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++代码实例相关推荐

  1. 【python+opencv】图像卷积及滤波

    目录 1.噪声的分类 2.图像卷积 2.1单次卷积操作 2.2对整幅图像卷积 2.3完整卷积过程 3.opencv中的卷积-filter2D函数 4.卷积中的padding填充(边界填充) 5.pad ...

  2. OpenCV实现图像对齐ECC算法(附完整代码)

    OpenCV实现图像对齐ECC算法 OpenCV实现图像对齐ECC算法 OpenCV实现图像对齐ECC算法 #include <opencv2/imgcodecs.hpp> #includ ...

  3. Ros下使用OpenCV对图像进行处理

    Ros中的图像信息是sensor_msgs/Image的格式,而OpenCV 中图像是cv:Mat格式.所以从Ros中获取的图像不能直接用OpenCV进行处理,需要进行格式转化.还好,Ros中提供了进 ...

  4. java 图片旋转 翻转 镜像处理_Java OpenCV实现图像镜像翻转效果

    本文实例为大家分享了Java OpenCV实现图像镜像翻转效果的具体代码,供大家参考,具体内容如下 主要使用OpenCV的flip()方法,可以实现图像的垂直.水平以及同时垂直镜像翻转. flip是C ...

  5. Java垂直镜像,Java OpenCV实现图像镜像翻转效果

    本文实例为大家分享了Java OpenCV实现图像镜像翻转效果的具体代码,供大家参考,具体内容如下 主要使用OpenCV的flip()方法,可以实现图像的垂直.水平以及同时垂直镜像翻转. flip是C ...

  6. 8.openCV 裁剪图像

    8.openCV 裁剪图像 一.使用 OpenCV 裁剪图像 二.项目结构和代码讲解 1.项目结构 2.代码讲解 三.代码下载 一.使用 OpenCV 裁剪图像 在本教程的第一部分,我们将讨论如何将 ...

  7. java图片镜像代码_Java OpenCV实现图像镜像翻转效果

    本文实例为大家分享了Java OpenCV实现图像镜像翻转效果的具体代码,供大家参考,具体内容如下 主要使用OpenCV的flip()方法,可以实现图像的垂直.水平以及同时垂直镜像翻转. flip是C ...

  8. matlab作卷积的公式,卷积相关公式的matlab代码

    取半径=3 用matlab代码实现上式公式: length=3; for Ki = 1:length for Kj = 1:length for Kk = 1:length Ksigma(Ki,Kj, ...

  9. OpenCV学习笔记(十)——图像卷积(cv.filter2D()、矩阵旋转cv.filp())

    目录 1 图像卷积过程 2 cv.filter2D() 3 cv.filp() 卷积运算在信号处理中十分常见,而图像信息可以看成一种信号.例如,图像的每一行可以看出测量亮度变化的信号,而每一列可以看作 ...

最新文章

  1. 已知小红今年12岁c语言编程,C语言程序设计第轮复习习题.doc
  2. 如何利用云原生技术构建现代化应用?
  3. PostgreSQL学习笔记8之索引
  4. Array.prototype.slice.call 将伪数组转成真数组的原理是什么?
  5. php5.3降5.2,php5.3降级为5.2
  6. 小屏旗舰新王者: 三星Galaxy S11e曝光
  7. python 并发编程目录
  8. matlab 病态方程组,数值分析(Hilbert矩阵)病态线性方程组的求解Matlab程序
  9. 持续集成部署Jenkins工作笔记0016---测试验证整个自动化持续集成流程
  10. el表达式 多条件判断
  11. Unity AnimatorController 混合树 状态机 骨骼
  12. CZMDUI,简约而不简单的typecho模板
  13. selenium自动化购买火车票+存储数据库
  14. 计算两条线或多边形的交点(LineString | MultiLineString | Polygon )
  15. Java学习路线-20:正则表达式
  16. 2020计算机分数线,成都计算机电子信息学校2020年招生录取分数线
  17. k8s(四)—service服务(暴露方式:ClusterIP、NodePort、LoadBalancer、ExternalName、ingress)
  18. QT 安装 配置过程
  19. MATLAB复原动态模糊图像
  20. 在群晖中批量删除重复文件

热门文章

  1. 运满满的技术架构演进之路
  2. selenium打开chrome浏览器代码
  3. STOMP协议规范--转载
  4. 解决 ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)异常
  5. 《Credit Risk Scorecard》第四章:Data Review and Project Parameters
  6. 中科院罗平演讲全文:自动撰写金融文档如何实现,用 AI 解救“金融民工” | CCF-GAIR 2017
  7. 乐视姓孙还是姓贾?反正我不知道
  8. 汤晓鸥谈深度学习三大核心要素:算法设计、高性能的计算能力以及大数据
  9. 用gdb调试core dump文件
  10. Java Review - ArrayList 源码解读