详解OpenCV卷积滤波之边缘处理与锚定输出

原创: gloomyfish OpenCV学堂 今天

点击上方蓝字关注我们
星标或者置顶【OpenCV学堂】
干货与教程第一时间送达!
概述
OpenCV在使用卷积进行图像处理过程种,如何处理边缘像素与锚定输出两个技术细节一直是很多人求而不得的疑惑。其实OpenCV在做卷积滤波时会对图像进行边界填充,实现对边缘像素的卷积计算的支持,不同填充方式与不同锚定点会得到图像卷积输出不同的结果。
边界填充
我们首先来看一下OpenCV种支持标准卷积边缘填充做法,OpenCV支持的有如下几种卷积边缘填充算法:
常量边界
BORDER_CONSTANT
iiiiii|abcdefgh|iiiiiii

边界复制
BORDER_REPLICATE
aaaaaa|abcdefgh|hhhhhhh

边界反射
BORDER_REFLECT
fedcba|abcdefgh|hgfedcb

边界换行
BORDER_WRAP
cdefgh|abcdefgh|abcdefg

边界反射101
BORDER_REFLECT_101
gfedcb|abcdefgh|gfedcba

边界透明-很不幸运的是OpenCV4已经不支持啦!
BORDER_TRANSPARENT
uvwxyz|abcdefgh|ijklmno

默认填充方式
OpenCV中 filter2D, blur, GaussianBlur等卷积操作默认支持为BORDER_DEFAULT(BORDER_REFLECT_101)

各种不同方式对边缘的填充效果如下:

上图背景为红色,填充上下左右四个像素大小边缘!右下角为原图,左上角图像为常量边缘填充效果(i=0黑色)。

相关代码实现如下:
image = cv.imread(“D:/images/qxx.png”);
ih, iw = image.shape[:2]
border = 4

边界填充

b1 = cv.copyMakeBorder(image, border, border, border, border, cv.BORDER_CONSTANT)
b2 = cv.copyMakeBorder(image, border, border, border, border, cv.BORDER_REPLICATE)
b3 = cv.copyMakeBorder(image, border, border, border, border, cv.BORDER_REFLECT)
b4 = cv.copyMakeBorder(image, border, border, border, border, cv.BORDER_WRAP)
b5 = cv.copyMakeBorder(image, border, border, border, border, cv.BORDER_REFLECT_101)

边界填充类型说明

cv.putText(image, “input”, (20,20), cv.FONT_HERSHEY_PLAIN, 1.0, (255, 0, 0))
cv.putText(b1, “BORDER_CONSTANT”, (20, 20), cv.FONT_HERSHEY_PLAIN, 1.0, (255, 0, 0))
cv.putText(b2, “BORDER_REPLICATE”, (20, 20), cv.FONT_HERSHEY_PLAIN, 1.0, (255, 0, 0))
cv.putText(b3, “BORDER_REFLECT”, (20, 20), cv.FONT_HERSHEY_PLAIN, 1.0, (255, 0, 0))
cv.putText(b4, “BORDER_WRAP”, (20, 20), cv.FONT_HERSHEY_PLAIN, 1.0, (255, 0, 0))
cv.putText(b5, “BORDER_REFLECT_101”, (20, 20), cv.FONT_HERSHEY_PLAIN, 1.0, (255, 0, 0))

拼接结果输出

h = b1.shape[0]*2+8
w = b1.shape[1]*3+16
bh, bw = b1.shape[:2]
result = np.zeros([h, w, 3], dtype=np.uint8)
result[:,:,:] = (0, 0, 255)
result[0:bh,0:bw,:] = b1;
result[0:bh, bw+8:bw+bw+8, :] = b2;
result[0:bh, bw+bw+16:bw+bw+bw+16, :] = b3;
result[bh+8:bh+bh+8,0:bw,:] = b4;
result[bh+8:bh+bh+8, bw+8:bw+bw+8, :] = b5;
result[bh+12:bh+12+ih, bw+bw+20:bw+bw+20+iw, :] = image;

显示

cv.imshow(“result”, result)
cv.imwrite(“D:/border_result.png”, result)
cv.waitKey(0)
cv.destroyAllWindows()

锚定位置
在进行卷积处理的时候,卷积mask与对应的像素块点乘得到输出,把输出结果赋值给哪个像素点是由锚定参数anchor决定,以自定义滤波函数filter2D为例说明
void cv::filter2D(
InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor = Point(-1,-1),
double delta = 0,
int borderType = BORDER_DEFAULT
)
其中
kernel - 表示输入的自定义卷积核大小
anchor - 表示锚定点位置,默认情况Point(-1, -1)表示是卷积核的中心位置
borderType - 表示边缘填充的像素大小,ksize/2其中ksize表示卷积核大小

上述函数在卷积核为奇数的时候,卷积核的中心位置很容易确定,比如3x3的卷积核大小,中心位置为Point(1,1),5x5的卷积核大小中心位置为Point(2,2)

但是当卷积核大小为偶数的时候,很多人都搞不清楚中心位置是如何确定的,其实这个时候中心也为(ksize/2), 对2x2的卷积核,中心位置为Point(1,1),4x4的卷积核中心位置为Point(2,2)。
锚定位置对卷积结果的影响
以2x2与4x4的卷积核为与3x3与5x5的像素数据为例

情况一
2x2卷积核对3x3的像素块

当锚定点为默认(1,1)/(-1,-1)时候:

当锚定点设置为(0,0)时:

可以看到二者的输出结果全然不同,原因在于当锚定点不同的时候,卷积mask的开始位置也会不不同,图示如下:

情况二:
4x4卷积核对5x5的像素块:

使用BORDER_DEFAULT填充方式,填充之后为:

不同锚定位置的均值卷积输出结果:

三个不同锚定点对应卷积mask的起始位置与锚定像素输出:

代码演示如下:
src = np.zeros([3, 3], dtype=np.uint8)
src[0, 0] = 16
src[1, 1] = 8
src[2, 2] = 4
print("\n input image: \n",src)

k1 = [[1, 0], [0, -1]]
print("\nkernel : \n", k1)
result = cv.copyMakeBorder(src, 1, 1, 1, 1, cv.BORDER_DEFAULT)
print("\nBORDER_DEFAULT 边界填充 : \n", result)
dst = cv.filter2D(src, cv.CV_32F, np.asarray(k1), None, anchor=(0, 0), borderType=cv.BORDER_DEFAULT)
print("\nfilter2D : \n", dst)
print("\n")

src = np.zeros([5, 5], dtype=np.uint8)
src[0, 0] = 32
src[1, 1] = 16
src[2, 2] = 8
src[3, 3] = 4
src[4, 4] = 2
print("\ninput: \n", src)
k2 = np.ones([4, 4], dtype=np.int32)
print("\nkernel:\n", k2)
result = cv.copyMakeBorder(src, 3, 3, 3, 3, cv.BORDER_DEFAULT)
print("\n边界填充:\n", result)
dst = cv.filter2D(src, cv.CV_32F, np.asarray(k2), None, anchor=(-1, -1), borderType=cv.BORDER_DEFAULT)
print("\n filter2D Result: \n", dst)

专知 2019/4/24(图像填充方法大全)相关推荐

  1. wps公式如何加序号_Excel函数公式,批量填充方法大全

    函数和数据透视表是日常excel使用最多.频率最高的功能,让我们快速提高效率.日常工作中,我们经常需要输入公式,如果一个个输入,估计要输入到天荒地老,加班到天亮. 今天我们来学习如何快速高效的批量填充 ...

  2. 图像填充不怕区域大!MSRA等提出协同调制生成对抗网络

    编者按:图像填充是深度学习领域内的一个热点任务.尽管现有方法对于小规模.稀疏区域的填充可以取得不错的效果,但对于大规模的缺失区域始终无能为力.为解决这一问题,微软亚洲研究院提出了协同调制生成式对抗网络 ...

  3. matlab灰度图孔洞填充,一种深度图像空洞的自动填充方法与流程

    本发明涉及深度图像空洞填充技术,从彩色图像的结构相似性出发,求解空洞像素点的多尺度结构相似性,将空洞像素分为平滑区域空洞像素和非平滑区域空洞像素,并针对不同的空洞像素,采用不同的填充算法.在平滑区域空 ...

  4. CVPR 2019 论文解读 | 基于多级神经纹理迁移的图像超分辨方法 (Adobe Research)

    基于多级神经纹理迁移的图像超分辨方法 超分辨(Super-Resolution)图像恢复旨在从低分辨模糊图像中恢复出高分辨的清晰图像,是计算机视觉中的一个重要任务,在工业界有非常强的应用前景.CVPR ...

  5. 2019年遥感图像稀疏表征_图片为:2019年网络最佳图像格式

    2019年遥感图像稀疏表征 JPEG,WEBP,HEIC,AVIF? 本指南将帮助您选择. (JPEG, WEBP, HEIC, AVIF? This guide will help you choo ...

  6. 图像修复方法总结以及深度学习的论文汇总(更新中。。。)

    1.图像修复总结 图像修复(Image inpainting or Image complete )的目的是在给定一个mask的情况下,填充缺失区域的像素,使其整体达到纹理和结构一致性,或者语义和视觉 ...

  7. 【OpenCV 例程200篇】24. 图像的仿射变换

    [OpenCV 例程200篇]24. 图像的仿射变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 几何变换的可以分 ...

  8. 十种常见的图像标注方法 | 数据标注

    计算机视觉的飞速发展离不开大量图像标注数据的支撑,随着各类图像检测.识别算法的商业化落地,市场对图像标注精准度愈发严格,同时针对不同的应用场景,也衍生出了不同的图像标注方法. 今天景联文科技给大家介绍 ...

  9. 【专知荟萃18】目标跟踪Object Tracking知识资料全集(入门/进阶/论文/综述/视频/专家,附查看)

    原创: 专知内容组 专知 2017-11-18 点击上方"专知"关注获取专业AI知识! [导读]主题荟萃知识是专知的核心功能之一,为用户提供AI领域系统性的知识学习服务.主题荟萃为 ...

最新文章

  1. 分享Kali Linux 2017年第17周镜像文件
  2. SpringBoot开发接口
  3. jsdelivr 缓存刷新
  4. CentOs基础操作指令(进程管理)
  5. php 和new date,将JavaScript new Date()转换为php DateTime()
  6. oracle SQL查询
  7. 为什么用preparedStatement 而不是statement
  8. 利润表模板excel_Excel教程:作为财务,这些excel技巧你还不会吗?
  9. Docker入门教程
  10. 计算机id和密码忘了怎么办,苹果账号密码忘记了怎么办_苹果忘了id账号和密码的处理方法...
  11. 【面试概率】52张扑克牌,红桃A和黑桃A同时被一个人拿到的概率
  12. Latex 合并多个pdf文件
  13. 【联盛德W806上手笔记】六、7816/UART 控制器
  14. linux没有cpufreq目录,【原创】Linux cpufreq framework
  15. 影响内存频率的几个因素
  16. 《Unity3D-鱼的方向 鱼的游动 控制代码》
  17. 平生事,此时凝睇,谁会凭栏意!(2)
  18. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解
  19. 监控摄像头服务器维护要多久,监控摄像头如何维护 监控摄像头维护方法【详解】...
  20. 读代码比写代码难,真的?

热门文章

  1. 随机模型,估计与控制 ——介绍
  2. 2017 终点亦是起点
  3. mysql数据库表格数据类型_MYSQL数据库数据表字段类型含义解释
  4. azure 配置vpn_ASP.NET和Azure中配置中的私有配置数据和连接字符串的最佳做法
  5. 电力作业虚拟仿真培训教学平台的功能及特色介绍
  6. JETSON产品组合: nano, TX, Xavier
  7. mariadb ROW格式复制下从库结构变更引发1677错误
  8. 【python爬虫】用python编写LOL战绩查询
  9. html中 选择子元素 子元素选择器
  10. 多类差异信息柔性融合概念与内涵