【边缘填充】——图像预处理(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()

输出:

相关推荐
测试员周周4 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
K姐研究社5 小时前
怎么用AI制作电商口播视频,开拍APP一键生成
人工智能·音视频
LaughingZhu6 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
传说故事6 小时前
【论文阅读】MotuBrain: An Advanced World Action Model for Robot Control
论文阅读·人工智能·具身智能·wam
北京耐用通信7 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
火山引擎开发者社区7 小时前
TRAE × 火山引擎 Supabase:为你的 AI 应用装上“数据引擎”
人工智能
小a彤7 小时前
GE 在 CANN 五层架构中的位置
人工智能·深度学习·transformer
前端若水7 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Upsy-Daisy8 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习
企学宝8 小时前
企学宝5月专题课程丨《OpenClaw AI 智能体实战营:从零基础部署到全场景自动化落地》
人工智能·ai·企业培训