opencv (二十八)图像卷积

小白学习视觉、笔记、拓展
opencv (二十八)图像卷积
第一步,旋转180°
如果模板是对称的可以不用旋转180°,如果不对称,必须旋转180。
注意的是,卷积函数没有自带旋转180°功能,需单独写。

对于边缘像素,求卷积需要外扩,比求如第一个元素1的卷积,那么卷积模板中心放在1的位置,外面就超出去了,所以原图需要外扩一圈像素。外扩的部分用 0补。

第一个元素卷积结果为23

33的卷积核,外扩一层像素;
55的卷积核,外扩二层像素;
opencv (二十八)图像卷积

#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;
}

opencv (二十八)图像卷积
opencv (二十八)图像卷积

版权声明:本文为博主R-G-B原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/m0_51233386/article/details/123302488

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年3月7日
下一篇 2022年3月7日

相关推荐