小白学习视觉、笔记、拓展
第一步,旋转180°
如果模板是对称的可以不用旋转180°,如果不对称,必须旋转180。
注意的是,卷积函数没有自带旋转180°功能,需单独写。
对于边缘像素,求卷积需要外扩,比求如第一个元素1的卷积,那么卷积模板中心放在1的位置,外面就超出去了,所以原图需要外扩一圈像素。外扩的部分用 0补。
第一个元素卷积结果为23
33的卷积核,外扩一层像素;
55的卷积核,外扩二层像素;
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
//待卷积矩阵
uchar points[25] = { 1,2,3,4,5,
6,7,8,9,10,
11,12,13,14,15,
16,17,18,19,20,
21,22,23,24,25 };
Mat img(5, 5, CV_8UC1, points);
//卷积模板
Mat kernel = (Mat_<float>(3, 3) << 1, 2, 1,
2, 0, 2,
1, 2, 1);
Mat kernel_norm = kernel / 12; //卷积模板归一化,因为0~255像素值卷积后,难免超出255,统一除以卷积模板的元素和12
//未归一化卷积结果和归一化卷积结果
Mat result, result_norm;
//这个模板是对称的可以不用旋转180°,如果不对称,必须旋转180。注意的是,卷积函数没有自带旋转180°功能,需单独写。
filter2D(img, result, CV_32F, kernel, Point(-1, -1), 2, BORDER_CONSTANT);
filter2D(img, result_norm, CV_32F, kernel_norm, Point(-1, -1), 2, BORDER_CONSTANT);
cout << "result:" << endl << result << endl;
cout << "result_norm:" << endl << result_norm << endl;
//图像卷积
Mat lena = imread("lena.png");
if (lena.empty())
{
cout << "请确认图像文件名称是否正确" << endl;
return -1;
}
Mat lena_fillter;
filter2D(lena, lena_fillter, -1, kernel_norm, Point(-1, -1), 2, BORDER_CONSTANT);
imshow("lena_fillter", lena_fillter);
imshow("lena", lena);
waitKey(0);
return 0;
}
版权声明:本文为博主R-G-B原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/m0_51233386/article/details/123302488