0
点赞
收藏
分享

微信扫一扫

【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课

老王420 2022-02-19 阅读 60

13 自定义滤波

opencv知识点:

  • 将图像与内核卷积 - filter2D
  • 缩放 取绝对值 转换为8位 - convertScaleAbs

本课所解决的问题:

  • 什么是自定义滤波?
  • 如果实现自定义滤波的均值卷积?
  • 如果实现自定义滤波的非均值卷积?

1.自定义滤波

我们知道,不同卷积核下的图像卷积意义是不同的,因此卷积核在卷积过程中充当着十分重要的角色。

通过自定义的卷积核来卷积,这种方式的术语为:自定义滤波(customize filter)

在OpenCV中,自定义滤波要用到API

  • filter2D

具体介绍如下
filter2D

filter2D
	将图像与内核卷积
		共7个参数 
			第1个参数 输入
			第2个参数 输出
			第3个参数 输出图像的深度(-1表示和输入图像一直)
			第4个参数 卷积核
			第5个参数 锚点
					(指示内核中过滤点的相对位置;
					  锚点应位于内核中;
					  默认值Point(-1,-1),表示锚点位于内核中心)
			第6个参数 delta变量(可以调整亮度)
			第7个参数 borderType

2.自定义滤波演示

均值卷积

首先我们演示一下自定义滤波的均值卷积

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

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
	Mat src = imread("D:/WorkSpace/Opencv/images/hahaha.jpg");
	if (src.empty()) {
		printf("could not find image file");
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	// 自定义滤波 - 均值卷积
	int k = 15;
	Mat mkernel = Mat::ones(k, k, CV_32F) / (float)(k * k);//示例创建了CV_32F类型的卷积核

	Mat dst;
	filter2D(src, dst, -1, mkernel, Point(-1, -1), 0, BORDER_DEFAULT);
	imshow("custom mean filter", dst);

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

在这里插入图片描述

非均值卷积

接下来我们演示自定义滤波的非均值卷积

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

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
	Mat src = imread("D:/WorkSpace/Opencv/images/hahaha.jpg");
	if (src.empty()) {
		printf("could not find image file");
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	// 非均值滤波
	
	Mat robot = (Mat_<int>(2, 2) << 1, 0, 0, -1);
	/*
		创建一个2行2列的图像,然后数据流入进行初始化
	*/
	Mat result;
	filter2D(src, result, CV_32F, robot, Point(-1, -1), 127, BORDER_DEFAULT);
	convertScaleAbs(result, result);
	/*
	CV_32F类型时,数据有正有负,图像显示会很糟糕
	我们可以用convertScaleAbs进行一下格式化
	*/
	
	imshow("robot filter", result);

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

为什么要进行格式化的详细解释
在这里插入图片描述
可以看到,原有的CV_8U类型已经无法满足了,输出图像深度要进行更改为其他,如CV_32F

但是CV_32F的图像直接输出会很糟糕,效果如下
在这里插入图片描述
格式化之后的图像就会好很多,效果如下
在这里插入图片描述
图像很暗,我们把delta = 127,效果如下
在这里插入图片描述

本课所用API查阅

filter2D

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

convertScaleAbs

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Mat_<float> A(30,30);
randu(A, Scalar(-100), Scalar(100));
Mat_<float> B = A*5 + 3;
B = abs(B);
// Mat_<float> B = abs(A*5+3) 也可以完成这项工作,
// 但它会分配一个临时矩阵

在这里插入图片描述

举报

相关推荐

0 条评论