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

本文详细介绍了OpenCV中的图像卷积和边缘填充技术,包括均值卷积、BorderTypes中的BORDER_DEFAULT填充方法、卷积核的锚定点概念。通过实例演示了如何使用copyMakeBorder函数进行边缘填充,并展示了不同锚定点的计算结果。此外,还讨论了卷积核大小对锚定点位置的影响。

个人资料,仅供学习使用
修改时间——2022年2月19日 13:28:28
学习课程:OpenCV4 图像处理与视频分析实战教程
课程讲师:贾志刚

11 图像卷积+卷积边缘处理

opencv知识点:

  • 均值卷积 - blur
  • 边缘处理方式 - BorderTypes
  • 在图像周围形成边框 - copyMakeBorder

本课所解决的问题

  • 如何理解卷积?
  • 如何理解图像卷积?
  • 如何实现对图像的均值卷积?
  • 如何填充图像边缘?
  • 如何理解卷积核的锚定点?

1.图像卷积

关于图像卷积,可以阅读 27 图像卷积操作,文章中非常详细。

2.卷积边缘处理

现在我们来详细了解一下卷积边缘处理

填充方法

常用的有如下五种填充方法:
在这里插入图片描述
现在我们针对BORDER_DEFAULT方法做一个简单示例

可以看到

  • 填充的长度为3
  • 填充的方式为镜像
    在这里插入图片描述

锚定点问题

填充完毕后,我们还要注意卷积核的锚定点位置

我们针对原图来说明锚定点,说明如下:

  • Point(-1,-1)——卷积核与原图左边重合;卷积核与原图上边重合;锚定点位于卷积核中心
    注意:卷积核大小不同,如3x3,5x5,则卷积核中心不同(偶数无核)
  • Point(0,0)——卷积核与原图左边重合;卷积核与原图上边重合;锚定点位于Point(0,0)
  • Point(1,1)——卷积核与原图左边-1重合;卷积核与原图上边-1重合;锚定点位于Point(1,1)
  • Point(2,2)——卷积核与原图左边-2重合;卷积核与原图上边-2重合;锚定点位于Point(2,2)

在这里插入图片描述

在填充后的图像中,原图的锚定点Point(2,2)对应填充后图像的锚定点Point(-1,-1)
所以锚定点Point(2,2)在本例中也是默认锚定点,默认的中心位置

如下是三个不同锚点的计算结果(它们的长宽与原图一致)
在这里插入图片描述

边缘填充演示

现在我们开始边缘填充的演示

在OpenCV中,边缘填充要用到这样一个API

  • copyMakeBorder

具体介绍如下
copyMakeBorder

copyMakeBorder
	在图像周围形成边框
		共8个参数
			第1个参数 输入
			第2个参数 输出
			第3个参数 top宽度
			第4个参数 bottom宽度
			第5个参数 left宽度
			第6个参数 right宽度
			第7个参数 borderType
			
			第8个参数 引用类型的Scalar
					(这个参数只有当borderType=BORDER_CONSTANT时才生效)
#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 border = 8;
	Mat border_m;
	copyMakeBorder(src, border_m, border, border, border, border,BORDER_WRAP,Scalar(0, 255, 0));
	imshow("border fill demo", border_m);

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

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

本课所用API查阅

blur

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

BorderTypes

在这里插入图片描述

copyMakeBorder

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

// 让边框在所有方向上都相同
int border=2;
// 构造一个更大的图像以适应图像和边框
Mat gray_buf(rgb.rows + border*2, rgb.cols + border*2, rgb.depth());
// 选择它的中间部分而不复制数据
Mat gray(gray_canvas, Rect(border, border, rgb.cols, rgb.rows));
// 将图像从 RGB 转换为灰度
cvtColor(rgb, gray, COLOR_RGB2GRAY);
// 就地形成边框
copyMakeBorder(gray, gray_buf, border, border,
               border, border, BORDER_REPLICATE);
// 现在做一些自定义过滤...
...

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啦啦啦大赛第大所

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值