2. opencv的实现
在图像处理中,经常需要空域或频域的滤波处理,在进入真正的处理程序前,需要考虑图像边界情况。
通常的处理方法是为图像增加一定的边缘,以适应 卷积核 在原图像边界的操作。
1. 增加边界的类型有以下4个类型:
以一行图像数据为例,abcdefgh是原图数据,|是图像边界,为原图加边
aaaaaa|abcdefgh|hhhhhhh 重复
fedcba|abcdefgh|hgfedcb 反射
gfedcb|abcdefgh|gfedcba 反射101,相当于上一行的左右互换
cdefgh|abcdefgh|abcdefg 外包装
iiiiii|abcdefgh|iiiiiii with some specified 'i' 常量
2. opencv的实现
opencv中有几处增加边界的实现,其源码分别散布在Utils.cpp,Filter.cpp,Ts_func.cpp中,功能和实现都基本相同。
以Utils的copyMakeBorder,及Filter中的borderInterpolate为例,这两种的代码风格比较通俗易懂。
边界处理的步骤:
首先,为目的图像(结果图像)分配内存,图像大小为size(src.rows + top + bottom, src.cols + left + right)
然后,以原图为基准,逐行处理,先扩展左边界,复制原图数据到目的图像,再扩展右边界。
最后,扩展上边界,以及下边界。
其中,每扩展一个边界像素,都需要计算出对应的原图中的位置,这个功能被提炼出来,就是borderInterpolate
/*
Various border types, image boundaries are denoted with '|'
* BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
* BORDER_REFLECT: fedcba|abcdefgh|hgf

本文介绍了OpenCV中图像边界扩展的方法,重点讨论了copyMakeBorder函数的使用,包括四种边界类型:重复、反射、反射101和外包装。并详细解析了opencv的实现过程,涉及Utils.cpp、Filter.cpp、Ts_func.cpp中的相关源码,以及如何通过borderInterpolate计算原图对应位置。最后提到了medianBlur函数中采用的重复复制最边缘像素的BORDER_REPLICATE边界处理方式。

1805

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



