图像处理中的边缘填充:原理与实践

目录

一、为什么需要边缘填充?

二、边缘填充方法

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

[4.2 边界反射(BORDER_REFLECT)](#4.2 边界反射(BORDER_REFLECT))

[4.3 边界反射101(BORDER_REFLECT_101)](#4.3 边界反射101(BORDER_REFLECT_101))

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

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

三、完整代码

四、总结


在图像处理中,边缘填充是一个常见的操作,尤其是在对图像进行旋转、缩放或变换时。填充边缘可以避免图像边界出现空白区域,从而保持图像的完整性。本文将详细介绍五种常用的边缘填充方法,并通过代码示例展示它们的实际应用。

一、为什么需要边缘填充?

在对图像进行旋转或变换时,原图像的某些部分可能会超出目标图像的边界,导致目标图像中出现空白区域。例如,当我们将一张图片逆时针旋转45度时,原图的四个顶点在旋转后的图像中已经看不到了,而旋转后的图像的四个顶点区域实际上是空白的。为了填补这些空白区域,我们需要对边缘进行填充。

以下是一个简单的例子:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| 原图: | 旋转后的图: |
| | |

可以看到,旋转后的图像中出现了黑色的空白区域。为了避免这种情况,我们需要对这些空白区域进行填充。

二、边缘填充方法

OpenCV提供了多种边缘填充方法,每种方法都有其独特的填充方式和应用场景。以下是五种常用的边缘填充方法:

4.1 边界复制(BORDER_REPLICATE)

原理

边界复制会将边界处的像素值进行复制,然后作为边界填充的像素值。填充后的图像四周的像素值与边界像素值相同。

示例

原图与填充后的图像对比如下:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| 原图 | 边界复制填充 |
| | |

代码实现

python 复制代码
import cv2
import numpy as np

def test_edge_filling():
    img = cv2.imread("./src/cat.png")
    h, w, c = img.shape
    scale = 0.5
    m = cv2.getRotationMatrix2D((w // 2, h // 2), 45, scale)
    frame = (w, h)
    
    img_replicate = cv2.warpAffine(img, m, frame, borderMode=cv2.BORDER_REPLICATE)
    cv2.imshow("Original Image", img)
    cv2.imshow("Replicate Border", img_replicate)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    test_edge_filling()

4.2 边界反射(BORDER_REFLECT)

原理

边界反射会根据原图的边缘进行反射填充。填充后的图像在边界处形成镜像效果。

示例

原图与填充后的图像对比如下:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| 原图 | 边界反射填充 |
| | |

代码实现

python 复制代码
img_reflect = cv2.warpAffine(img, m, frame, borderMode=cv2.BORDER_REFLECT)
cv2.imshow("Reflect Border", img_reflect)

4.3 边界反射101(BORDER_REFLECT_101)

原理

与边界反射不同的是,边界反射101不再反射边缘的像素点,而是从倒数第二个像素点开始反射。

示例

原图与填充后的图像对比如下:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| 原图 | 边界反射101 |
| | |

代码实现

python 复制代码
img_reflect_101 = cv2.warpAffine(img, m, frame, borderMode=cv2.BORDER_REFLECT_101)
cv2.imshow("Reflect 101 Border", img_reflect_101)

4.4 边界常数(BORDER_CONSTANT)

原理

边界常数填充会用指定的常量值填充空白区域。默认的填充常数值为0(黑色),但也可以指定其他颜色。

示例

原图与填充后的图像对比如下:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| 原图 | 边界常数填充 |
| | |

代码实现

python 复制代码
img_constant = cv2.warpAffine(img, m, frame, borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 0, 127))
cv2.imshow("Constant Border", img_constant)

4.5 边界包裹(BORDER_WRAP)

原理

边界包裹会将图像的边界部分"包裹"到另一侧,形成循环效果。

示例

原图与填充后的图像对比如下:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| 原图 | 边界反射101 |
| | |

代码实现

python 复制代码
img_wrap = cv2.warpAffine(img, m, frame, borderMode=cv2.BORDER_WRAP)
cv2.imshow("Wrap Border", img_wrap)

三、完整代码

python 复制代码
import cv2
import numpy as np

# 填充方式
# 边界复制(BORDER_REPLICATE): 复制边界像素值
# 边界反射(BORDER_REFLECT): 以边界为对称轴,反射填充
# 边界反射101(BORDER_REFLECT_101): 以边界为对称轴,反射填充,但首尾像素不重复
# 边界常数(BORDER_CONSTANT): 用指定常量填充
# 边界包裹(BORDER_WRAP): 以边界为对称轴,循环填充
def test001():
    img = cv2.imread("./src/cat.png")
    h, w, c = img.shape
    scale = 0.5
    m = cv2.getRotationMatrix2D((w // 2, h // 2), 45, scale)
    frame=(w,h)
    # 如果scale后的图像比frame小 就会有部分像素没值 就会进行填充
    img_replicate=cv2.warpAffine(img,m,frame,borderMode=cv2.BORDER_REPLICATE)
    img_reflect=cv2.warpAffine(img,m,frame,borderMode=cv2.BORDER_REFLECT)
    img_reflect_101=cv2.warpAffine(img,m,frame,borderMode=cv2.BORDER_REFLECT_101)
    img_constant=cv2.warpAffine(img,m,frame,borderMode=cv2.BORDER_CONSTANT,borderValue=(0,0,127))
    img_wrap=cv2.warpAffine(img,m,frame,borderMode=cv2.BORDER_WRAP)
    
    cv2.imshow("img",img)
    cv2.imshow("img_replicate",img_replicate)
    cv2.imshow("img_reflect",img_reflect)
    cv2.imshow("img_reflect_101",img_reflect_101)
    cv2.imshow("img_constant",img_constant)
    cv2.imshow("img_wrap",img_wrap)
    cv2.waitKey(0)

if __name__ == '__main__':
    test001()

四、总结

本文介绍了五种常用的边缘填充方法:边界复制、边界反射、边界反射101、边界常数和边界包裹。每种方法都有其独特的应用场景和效果。在实际应用中,可以根据具体需求选择合适的填充方法。

  • 边界复制:适合需要保持边界像素值不变的场景。

  • 边界反射:适合需要镜像效果的场景。

  • 边界反射101:适合需要更自然的镜像效果的场景。

  • 边界常数:适合需要特定颜色填充的场景。

  • 边界包裹:适合需要循环效果的场景。

相关推荐
三道杠卷胡3 分钟前
【AI News | 20250804】每日AI进展
人工智能·python·语言模型·github·aigc
蓝屏的钙16 分钟前
从 FastGPT 中浅析 RAG 技术
人工智能·llm
人机与认知实验室19 分钟前
是的,或许这就是意识!
人工智能
微凉的衣柜21 分钟前
GitHub Models:为开源AI项目解决推理难题,让AI更易用、更普及
人工智能·开源·github
神经星星1 小时前
登 Science,David Baker 团队提出无序区域结合蛋白设计新方法,专攻不可成药靶点
人工智能·机器学习·编程语言
图灵学术计算机论文辅导1 小时前
从 “看懂图” 到 “读懂视频”:多模态技术如何用文本反哺视觉?
论文阅读·人工智能·学习·考研·计算机视觉·目标跟踪
爱分享的飘哥1 小时前
第三十五章:让AI绘画“动”起来:第一个AI视频诞生-AnimateDiff的时间卷积结构深度解析
人工智能·ai作画·ai视频生成·animatediff原理·时间卷积·video diffusion·sd动画
终端域名1 小时前
机器人权利:真实还是虚幻,机器人权利研究如何可能,道德权利与法律权利
人工智能
科技圈快讯1 小时前
AI+OA原生应用 麦当秀AIPPT
人工智能
音视频牛哥1 小时前
AIGC时代的视频基础设施:从数据采集到生成响应的全链路实践
人工智能·机器学习·aigc