目录
2.1.1、filter2D(isrc, dst, src.depth(), kernel);
2.2.1、实现图像锐化的C++代码,需要安装Opencv(安装教程)
1、图像锐化和边缘提取简介
1.1、图像锐化简介
所谓的图像锐化,就是将图像的边缘变得更加清晰,和图像的模糊可以看成是相对立的操作,但是并不是说模糊和锐化同时用会抵消,各有各的用处。比如脸上有小痘痘或者有皱纹想要美化就可以用模糊,而女朋友给你发的照片不清晰就可以尝试用锐化使其边缘更加清晰(如果效果甚妙,你女朋友可能会揍你~)。
1.2、边缘提取简介
边缘提取,就是字面意思了,有的地方叫边界提取,一样的。首先要知道什么是图像的边缘,拿灰度图像来说(一般对灰度图像进行研究,彩色图像可以看成是多幅灰度图像叠加),图像的边缘一般来说人眼能看得出来是因为对应的位置有较大的灰度值差异。如果一幅图从上到下渐变(较小的灰度值调整)的就很难看出来边界,或者说边界不明显。理解了它的原理,后面就方便自己实现了。
2、Opencv自带的锐化和边缘提取函数函数
2.1、重要的Opencv函数
2.1.1、filter2D(isrc, dst, src.depth(), kernel);
这个函数的作用是实现图像的求卷积操作,虽然也有别的用处,但是以后学到了再说吧,毕竟不能一口一个胖子啊
filter2D()参数表(不全,仅列出这里用到的)
参数名 | 说明 |
src | 输入图像 |
dst | 输出图像 |
src.depth() | 图像的深度(有兴趣可以查一下),这里就直接写成了输入图像的深度 |
kernel | 卷积核,一个小矩阵 |
2.1.2、常用的kernel
Sobel_x | Sobel_y | |||||
-1 | -2 | -1 | -1 | 0 | 1 | |
0 | 0 | 0 | -2 | 0 | 2 | |
1 | 2 | 1 | -1 | 0 | 1 | |
Prewitt_x | Prewitt_y | |||||
-1 | -1 | -1 | -1 | 0 | 1 | |
0 | 0 | 0 | -1 | 0 | 1 | |
1 | 1 | 1 | -1 | 0 | 1 | |
Laplacian_4 | Laplacian_8 | |||||
0 | -1 | 0 | -1 | -1 | -1 | |
-1 | 4 | -1 | -1 | 8 | -1 | |
0 | -1 | 0 | -1 | -1 | -1 |
根据以上的卷积核,和原图像进行卷积操作后可以得到原图像的边缘图像;
重点:如果要进行锐化操作,卷积核的中心点需要加1,比如Laplacian_4邻域的卷积核可以改写成:
Laplacian_4 | ||
0 | -1 | 0 |
-1 | 5 | -1 |
0 | -1 | 0 |
2.2、程序实现
2.2.1、实现图像锐化的C++代码,需要安装Opencv(安装教程)
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//读入图片并转换成灰度图,不转灰度也可以
Mat img = imread("C:/Users/含笑韭泉/Desktop/myImage/夜景2.jpg",1);
Mat imgGray;
cvtColor(img, imgGray, 6); //6就是COLOR_BGR2GRAY
//imgGray = img;
namedWindow("imgGray", WINDOW_KEEPRATIO);
resizeWindow("imgGray", 640, 480);
moveWindow("imgGray", 0, 0);
imshow("imgGray", imgGray);
waitKey();
//sobel x、y方向的一阶微分卷积核,注意中间像素点位置补偿1
Mat sobel_x = (Mat_<char>(3, 3) <<
-1, -2, -1,
0, 1, 0,
1, 2, 1);
Mat sobel_y = (Mat_<char>(3, 3) <<
-1, 0, 1,
-2, 1, 2,
-1, 0, 1);
//prewitt x、y方向的一阶微分卷积核
Mat prewitt_x = (Mat_<char>(3, 3) <<
-1, -1, -1,
0, 1, 0,
1, 1, 1);
Mat prewitt_y = (Mat_<char>(3, 3) <<
-1, 0, 1,
-1, 1, 1,
-1, 0, 1);
//laplacian 4领域和8领域的二阶微分卷积核
Mat laplacian_4 = (Mat_<char>(3, 3) <<
0, -1, 0,
-1, 5, -1,
0, -1, 0);
Mat laplacian_8 = (Mat_<char>(3, 3) <<
-1, -1, -1,
-1, 9, -1,
-1, -1, -1);
Mat imgSobel, imgPrewitt, imgLaplacian;
//利用x方向上的sobel卷积核进行图像锐化
filter2D(imgGray, imgSobel, imgGray.depth(), sobel_x);
namedWindow("imgSobel", WINDOW_KEEPRATIO);
resizeWindow("imgSobel", 640, 480);
imshow("imgSobel", imgSobel);
waitKey();
//利用y方向上的prewitt卷积核进行图像锐化
filter2D(imgGray, imgPrewitt, imgGray.depth(), prewitt_y);
namedWindow("imgPrewitt", WINDOW_KEEPRATIO);
resizeWindow("imgPrewitt", 640, 480);
imshow("imgPrewitt", imgPrewitt);
waitKey();
//利用8领域拉普拉斯卷积核进行图像锐化
filter2D(imgGray, imgLaplacian, imgGray.depth(), laplacian_8);
namedWindow("imgLaplacian", WINDOW_KEEPRATIO);
resizeWindow("imgLaplacian", 640, 480);
imshow("imgLaplacian", imgLaplacian);
waitKey();
return 0;
}
2.2.2、运行效果
--------------------------------------------------------20240801------------------------------------------------------------
原本这篇文章是打算加上边缘提取的,由于个人原因推迟发布,再看时已经找不到源代码了,所以先发布了此篇文章。后面补充了图像边缘相关的博文,感兴趣的也可以看看