本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials

本篇使用的项目为:gradient2

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char** argv) {
	Mat src = imread("../sample/lena512.bmp");
	if (src.empty()) {
		cout << "could not load image..." << endl;
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	Mat dst;
	Laplacian(src, dst, -1, 3, 1.0, 0, BORDER_DEFAULT);
	imshow("laplacian demo", dst);

	// 自定义卷积核做锐化
	Mat kernel = (Mat_<int>(3, 3) <<
		0, -1, 0,
		-1, 5, -1,
		0, -1, 0);

	Mat result;
	filter2D(src, result, CV_32F, kernel, Point(-1, -1), 0, BORDER_DEFAULT);
	convertScaleAbs(result, result);
	imshow("sharpen filter", result);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

Laplacian算子

属于二阶导数算子,将二阶导数为0的地方认为是边缘

opencv4入门笔记(19):图像边缘发现-萤火

标准形式:卷积核周围权重之和是中心的相反数

opencv4入门笔记(19):图像边缘发现-萤火
常见的Laplacian算子
void Laplacian( InputArray src, OutputArray dst, int ddepth, int ksize = 1, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT );
  • src:输入图像
  • dst:输出图像。与src具有相同的尺寸和通道数
  • ddepth:输出图像的深度。由于卷积核中有负数,一般用CV_32F,如果用CV_8U将会导致导数截断
  • ksize:卷积核尺寸。必须为正奇数
  • scale:比例因子,默认为1,即不使用
  • delta:在储存目标图像前可选的添加到像素的值,可用于提升亮度。 默认值为0
  • borderType:图像边缘处理方式

自定义卷积核实现锐化

关键是自定义卷积核,然后使用filter2D做卷积,例如:

// 自定义卷积核做锐化
Mat kernel = (Mat_<int>(3, 3) <<
	0, -1, 0,
	-1, 5, -1,
	0, -1, 0);