【边缘填充】——图像预处理(OpenCV)

目录

[1 边界复制(BORDER_REPLICATE)](#1 边界复制(BORDER_REPLICATE))

[2 边界反射(BOEDER_REFLECT)](#2 边界反射(BOEDER_REFLECT))

[3 边界反射101(BORDER_REFLECT101)](#3 边界反射101(BORDER_REFLECT101))

[4 边界常数(BORDER_CONSTANT)](#4 边界常数(BORDER_CONSTANT))

[5 边界包裹(BORDER_WRAP)](#5 边界包裹(BORDER_WRAP))


为什么需要填充边缘呢?我们以下图为例。

可以看到,左图在逆时针旋转45度之后原图的四个顶点在右图中已经看不到了,同时,右图的四个顶点区域其实是什么都没有的,因此我们需要对空出来的区域进行一个填充。右图就是对空出来的区域进行了像素值为(0,0,0)的填充,也就是黑色像素值的填充。除此之外,后续的一些图像处理方式也会用到边缘填充,这里介绍五个常用的边缘填充方法。

1 边界复制(BORDER_REPLICATE)

边界复制会将边界处的像素值进行复制,然后作为边界填充的像素值,如下图所示,可以看到四周的像素值都一样。

复制代码
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REPLICATE)

案例:

python 复制代码
import cv2 as cv
face = cv.imread("./images/face.png")
# 定义旋转中心
h,w = face.shape[:2]
center = (w//2,h//2)
# 获取旋转矩阵
M = cv.getRotationMatrix2D(center,45,0.5)
# 使用仿射变换矩阵进行旋转
img1 = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4)
# 边界复制
replicate = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4,borderMode=cv.BORDER_REPLICATE)
cv.imshow("face",face)
cv.imshow("new1",img1)
cv.imshow("replicate",replicate)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

2 边界反射(BOEDER_REFLECT)

根据原图的边缘进行反射。

python 复制代码
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT)

案例:

python 复制代码
import cv2 as cv
face = cv.imread("./images/face.png")
# 定义旋转中心
h,w = face.shape[:2]
center = (w//2,h//2)
# 获取旋转矩阵
M = cv.getRotationMatrix2D(center,45,0.5)
# 使用仿射变换矩阵进行旋转
img1 = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4)
# 边界反射
reflect = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT)
cv.imshow("face",face)
cv.imshow("new1",img1)
cv.imshow("reflect",reflect)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

3 边界反射101(BORDER_REFLECT101)

与边界反射不同的是,不再反射边缘的像素点。

python 复制代码
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT_101)

案例:

python 复制代码
import cv2 as cv
face = cv.imread("./images/face.png")
# 定义旋转中心
h,w = face.shape[:2]
center = (w//2,h//2)
# 获取旋转矩阵
M = cv.getRotationMatrix2D(center,45,0.5)
# 使用仿射变换矩阵进行旋转
img1 = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4)
# 边界反射101
reflect101 = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT_101)
cv.imshow("face",face)
cv.imshow("new1",img1)
cv.imshow("reflect101",reflect101)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

4 边界常数(BORDER_CONSTANT)

指定常数值作为边缘填充的像素值。

python 复制代码
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_CONSTANT,borderValue=(0,0,255))

案例:

python 复制代码
import cv2 as cv
face = cv.imread("./images/face.png")
# 定义旋转中心
h,w = face.shape[:2]
center = (w//2,h//2)
# 获取旋转矩阵
M = cv.getRotationMatrix2D(center,45,0.5)
# 使用仿射变换矩阵进行旋转
img1 = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4)
# 边界常数
constant = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4,borderMode=cv.BORDER_CONSTANT,borderValue=(255,0,0))
cv.imshow("face",face)
cv.imshow("new1",img1)
cv.imshow("constant",constant)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

5 边界包裹(BORDER_WRAP)

复制图像进行滑动填充

python 复制代码
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_WRAP)

案例:

python 复制代码
import cv2 as cv
face = cv.imread("./images/face.png")
# 定义旋转中心
h,w = face.shape[:2]
center = (w//2,h//2)
# 获取旋转矩阵
M = cv.getRotationMatrix2D(center,45,0.5)
# 使用仿射变换矩阵进行旋转
img1 = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4)
# 边界包裹
wrap = cv.warpAffine(face,M,(w,h),flags=cv.INTER_LANCZOS4,borderMode=cv.BORDER_WRAP)
cv.imshow("face",face)
cv.imshow("new1",img1)
cv.imshow("wrap",wrap)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

相关推荐
EVERSPIN10 分钟前
分享低功耗单火线开关语音识别方案
人工智能·语音识别
说私域24 分钟前
从渠道渗透到圈层渗透:开源链动2+1模式、AI智能名片与S2B2C商城小程序的协同创新路径研究
人工智能·小程序·开源
黎燃29 分钟前
人工智能在语言学习中的实践:从 Duolingo 到自研系统的深度剖析
人工智能
中科米堆1 小时前
中科米堆CASAIM金属件自动3d测量外观尺寸三维检测解决方案
人工智能·3d·视觉检测
88号技师1 小时前
2025年6月最新SCI-灰熊脂肪增长优化算法Grizzly Bear Fat Increase-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
爱分享的飘哥1 小时前
第三十篇:AI的“思考引擎”:神经网络、损失与优化器的核心机制【总结前面2】
人工智能·深度学习·神经网络·优化器·损失函数·mlp·训练循环
正经教主2 小时前
【n8n】如何跟着AI学习n8n【03】:HTTPRequest节点、Webhook节点、SMTP节点、mysql节点
人工智能·学习·教程·工作流·n8n
飞哥数智坊2 小时前
AI编程实战:使用Trae从零开始实现写作助手的后端开发及前后端联调
人工智能·trae
阿男官官2 小时前
[Token]ALGM: 基于自适应局部-全局token合并的简单视觉Transformer用于高效语义分割, CVPR2024
人工智能·深度学习·transformer·语义分割
2501_924732872 小时前
光伏热斑误检率↓79%!陌讯多模态融合算法在智慧能源的落地优化
算法·目标检测·计算机视觉·能源