概述
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+8w = b1.shape[1]*3+16bh, 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] = 16src[1, 1] = 8src[2, 2] = 4print( input image: ,src)k1 = [[1, 0], [0, -1]]print(kernel : , k1)result = cv.copymakeborder(src, 1, 1, 1, 1, cv.border_default)print(border_default 边界填充 : , result)dst = cv.filter2d(src, cv.cv_32f, np.asarray(k1), none, anchor=(0, 0), bordertype=cv.border_default)print(filter2d : , dst)print()src = np.zeros([5, 5], dtype=np.uint8)src[0, 0] = 32src[1, 1] = 16src[2, 2] = 8src[3, 3] = 4src[4, 4] = 2print(input: , src)k2 = np.ones([4, 4], dtype=np.int32)print(kernel:, k2)result = cv.copymakeborder(src, 3, 3, 3, 3, cv.border_default)print(边界填充:, result)dst = cv.filter2d(src, cv.cv_32f, np.asarray(k2), none, anchor=(-1, -1), bordertype=cv.border_default)print( filter2d result: , dst)
原文标题:详解opencv卷积滤波之边缘处理与锚定输出
文章出处:【微信公众号:opencv学堂】欢迎添加关注!文章转载请注明出处。
应用直线电机的掘进机器人将实现更高度的智能化
2023 浪潮云海云图峰会:共建共赢 释放生态价值
关于智慧工厂的一些概念
力触觉感知系统的工作原理
中兴手机Grand Memo LTE采用Marvell业界领先的4G LTE解决方案
OpenCV种支持标准卷积边缘填充做法
物联网世界的壁垒已被打破
仿真ADC的前端
如何做好防晒?防晒帽将你全面防护
倾斜控制系统,内置BoschSensortec MEMS传感器
小米MIX2最新消息:小米MIX2将于10月17日在印度线上开卖,比国内贵雷军给力
英飞凌AIROC云连接管理器模块
基于Android 11的realmeUI 2.0抢先体验计划扩展
雷尼绍正式发布全新RMP400超紧凑型应变片式测头
嘲讽技能全开的吐槽小米MIX3宣传Z5 Pro
整流二极管的参数是什么,整流二极管的作用是什么
如何利用关联量子传感技术实现点缺陷的三维纳米成像
光电耦合器应用电路
sql触发器的使用及语法介绍
“十二五”新能源和智能电网产业新机遇