个人资料,仅供学习使用
修改时间——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);
// 现在做一些自定义过滤...
...

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

849

被折叠的 条评论
为什么被折叠?



