本文演示了:
1. 如何生成卷积核。(为卷积核的每个元素赋值)
2. 如何利用 opencv 的 API 测试卷积核的效果。
说明:本文使用的编辑器是:vs2013, opencv 版本号是 320。
1. 生成卷积核。
这里直接把数值赋值给卷积核。
文件名:tests.h
#pragma once
#include "windows"
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#pragma comment(lib, "opencv_core320.lib")
#pragma comment(lib, "opencv_imgcodecs320.lib")
#pragma comment(lib, "opencv_imgproc320.lib")
#pragma comment(lib, "opencv_videoio320.lib")
#pragma comment(lib, "opencv_highgui320.lib")
// 边缘检测
cv::Mat get_sketch_kernel(int kernel_size);
// 图像锐化
cv::Mat get_sharpening_kernel(int kernel_size);
// 测试
void convol_test();
2. 测试卷积核的效果
文件名:tests.cpp
#include "tests.h"
using namespace std;
using namespace cv;
// 边缘检测
cv::Mat get_sketch_kernel(int kernel_size)
{
// 这里直接使用拉普拉斯算子作为卷积核
Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, -8, 1, 1, 1, 1);
return kernel;
}
// 图像锐化
cv::Mat get_sharpening_kernel(int kernel_size)
{
// 锐化
Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
return kernel;
}
// 卷积核测试。
void convol_test()
{
Mat src, dst;
int ddepth;
Point anchor;
double delta;
int kernel_size = 3;
// 生成一个掩模核 大小为 kernel_size*kernel_size, 作为卷积核
// Mat kernel = get_sharpening_kernel(kernel_size);
Mat kernel = get_sketch_kernel(kernel_size);
// 载入一张图片
src = imread("./female_ch_007.jpg");
if (!src.data)
{
cout << "invalid data ..." << endl;
Sleep(3000);
return;
}
// 创建窗口
imshow("before", src);
waitKey(500);
// 初始化滤波器参数
ddepth = -1;
anchor = Point(-1, -1);
delta = 0;
//将核设置好之后,使用函数 filter2D 就可以生成滤波器:
filter2D(src, dst, ddepth, kernel, anchor, delta, BORDER_DEFAULT);
imshow("after", dst);
waitKey(0);
system("pause");
}
void main()
{
convol_test();
system("pause");
}