(1)基础知识
①锐化滤波器用于突出显示图像的边界和其他精细细节。
②锐化是基于一阶导数和二阶导数的,一幅图像的一阶导数计算〔图像强度梯度〕的逼近,而二阶导数定义为该梯度的散度。
③由于数字图像处理研究离散量(像素值),因而将一阶导数和二阶导数离散过程用于锐化处理。
▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂
◆ 一阶导数会产生粗的图像边缘,因此广泛应用于图像边缘。
◆ 二阶导数对精细细节的响应更好,常被应用于图像增强。
▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂
(2)常用算子
用于获取导数的两种常用算子是Sobel和Laplacian。
① Sobel算子计算图像I的一阶导数,公式如下:
通过整合两个梯度逼近值,可以获得如下的Sobel梯度幅值:
② 一幅图像的离散Laplacian值,可以作为下述核的卷积给出:
(1)Sobel算法
void Sobel(InputArray src,OutputArray dst,int ddepth,int dx,int dy,int ksize=3,double scale=1,double delta=0,int borderType=BORDER_DEFAULT);
说明:
①该函数使用Sobel算子计算图像src的一阶导数、二阶导数、三阶导数或混合图像导数。
②参数ddepth表示输出图像的深度,值为-1时。使用核输入图像相同的深度。
③用ksize表示核的大小,希望的导数阶为dx和dy。
④使用scale可以建立用于计算导数值的尺度因子。
⑤参数borderType表示边界类型,在dst中存储计算结果之前可以增加一个delta值。
(2)Scharr算法
void Scharr(InputArray src,OutputArray dst,int ddepth,int ksize=1,double scale=1,double delta=0,int borderType=BORDER_DEFAULT);
说明:
①该函数计算了一个大小为3×3的核更精确的导数。
②Scharr函数与Sobel函数等价。
(3)Laplacian算法
void Laplacian(InputArray src,OutputArray dsft,int ddepth,int ksize=1,double scale=1,double delta=0,int borderType=BORDER_DEFAULT);
①该函数计算图像的Laplacian值。
②除了参数ksize之外,所有的参数都等同于函数的Sobel和Scharr中的参数。
③ksize>1时,使用一个3×3的核(中心值为-4,4个角上的值为0,其余系数值为1)对该图像滤波来计算该Laplacian值。
//27.08.2019 by yh
#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
//读取源文件
Mat src;
src = imread("C:\\Users\\86151\\Pictures\\图像处理常用图片\\CBSD68\\295087.png");
//应用Sobel核Laplacian
Mat dst,dst2;
Sobel(src,dst,-1,1,1);
Laplacian(src,dst2,-1);
//显示结果
namedWindow("ORIGINAL",WINDOW_NORMAL);
imshow("ORIGINAL",src);
namedWindow("SOBEL", WINDOW_NORMAL);
imshow("SOBEL",dst);
namedWindow("LAPLACIAN", WINDOW_NORMAL);
imshow("LAPLACIAN", dst2);
cvWaitKey();
return 0;
}
End && Enjoy!