Opencv计算机视觉--边界填充&图像形态学

一、边界填充

1.cv2.copyMakeBorder()

cv2.copyMakeBorder()是0penCV库中的一个函数,用于给图像添加额外的边界(padding)。

2.相关参数介绍

copyMakeBorder(src: UMat, top: int, bottom: int, left: int, rignt: int, BorderType: int, dst: UMat | None = ..., value: cv2.typing.Scalar = ...)

参数:

src:要扩充边界的原始图像 top,bottom,left,right:相应方向上的边框宽度。

borderType:定义要添加边框的类型,它可以是以下的一种:

cv2.BORDER_CONSTANT:添加的边界框像素值为常数(需要额外再给定一个参数)

cv2.BORDER_REFLECT:添加的边框像素将是边界元素的镜面反射,类似于gfedcbglabcdefghlhgfedcbg。(交界处也复制了)

cv2.BORDER_REFLECT_101 或 cv2.BORDER_DEFAULT,和上面类似,但是有一些细微的不同,类似于gfedcblabcdefghlgfedcba(交接处删除了)

cv2.BORDER_REPLICATE:使用最边界的像素值代替,类似于aaaaaalabcdefghIhhhhhhh

cv2.BORDER_WRAP:上下左右边依次替换,cdefghlabcdefghlabcdefg

3.实例

python 复制代码
import cv2 

# 读取图片文件
ys1 = cv2.imread('peopleone.jpg')

# 将图片按比例缩放为原来的0.4倍
ys = cv2.resize(ys1, dsize=None, fx=0.4, fy=0.4) 

# 设置边框的宽度:上、下、左、右各50像素
top, bottom, left, right = 50, 50, 50, 50

# 创建常量边框(用固定颜色填充)
constant = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(229, 25, 80))

# 创建反射边框(镜像边缘像素,不重复边缘像素)
reflect = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)

# 创建反射101边框(镜像边缘像素,重复边缘像素)
reflect101 = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)

# 创建复制边框(重复边缘像素)
replicate = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)

# 创建包裹边框(平铺图像)
wrap = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_WRAP)

# 显示原始图片
cv2.imshow('yuantu', ys)
cv2.waitKey(0)  # 等待按键输入

# 显示常量边框效果
cv2.imshow('CONSTANT', constant)
cv2.waitKey(0)

# 显示反射边框效果
cv2.imshow('REFLECT', reflect)
cv2.waitKey(0)

# 显示反射101边框效果
cv2.imshow('REFLECT_101', reflect101)
cv2.waitKey(0)

# 显示复制边框效果
cv2.imshow('REPLICATE', replicate)
cv2.waitKey(0)

# 显示包裹边框效果
cv2.imshow('WRAP', wrap)
cv2.waitKey(0)

# 关闭所有OpenCV窗口
cv2.destroyAllWindows()

补充说明:

  1. cv2.copyMakeBorder()函数的value参数颜色顺序是BGR(蓝、绿、红),而不是RGB

  2. cv2.BORDER_REFLECTcv2.BORDER_REFLECT101的区别在于边界像素是否被重复使用

  3. 在OpenCV中,按Esc键可以快速关闭当前显示的图像窗口

  4. 如果图片路径不正确或图片不存在,程序可能会报错

二、图像形态学

1.形态学操作解释

复制代码
腐蚀(Erosion):用结构元素扫描图像,将中心像素替换为邻域内的最小值。效果是使前景对象变小,消除小的白色噪声。
膨胀(Dilation):用结构元素扫描图像,将中心像素替换为邻域内的最大值。效果是使前景对象变大,填充孔洞。
闭运算(MORPH_CLOSE):先膨胀后腐蚀。用于消除小孔洞,连接邻近物体,平滑边界。

2.cv2.morphologyEx()

2.1使用的操作类型
复制代码
cv2.MORPH_CLOSE     # 闭运算(MORPH_CLOSE):先膨胀后腐蚀。用于消除小孔洞,连接邻近物体,平滑边界
                    # 数学表达式:dst = erode(dilate(src))
                    # 典型应用:修复指纹断裂、填充文字中的空隙、去除黑色噪声点

cv2.MORPH_OPEN      # 开运算(MORPH_OPEN):先腐蚀后膨胀。用于消除小白点,分离邻近物体,平滑轮廓
                    # 数学表达式:dst = dilate(erode(src))
                    # 典型应用:去除白色噪声点、分离粘连物体、细化轮廓

cv2.MORPH_GRADIENT  # 形态学梯度(MORPH_GRADIENT):膨胀减去腐蚀。用于提取物体边缘
                    # 数学表达式:dst = dilate(src) - erode(src)
                    # 典型应用:边缘检测、提取物体轮廓、计算物体宽度

cv2.MORPH_TOPHAT    # 顶帽运算(MORPH_TOPHAT):原图减去开运算。用于提取比背景亮的细小物体
                    # 数学表达式:dst = src - open(src)
                    # 典型应用:不均匀光照校正、提取亮细节、增强亮特征

cv2.MORPH_BLACKHAT  # 黑帽运算(MORPH_BLACKHAT):闭运算减去原图。用于提取比背景暗的细小物体
                    # 数学表达式:dst = close(src) - src
                    # 典型应用:提取暗细节、检测暗区域特征、增强暗特征

cv2.MORPH_ERODE     # 腐蚀(MORPH_ERODE):用结构元素扫描图像,取邻域最小值。使物体缩小,消除小白点
                    # 等价于cv2.erode(),但在morphologyEx中作为统一接口使用
                    # 典型应用:去除毛刺、细化物体、分离粘连物体

cv2.MORPH_DILATE    # 膨胀(MORPH_DILATE):用结构元素扫描图像,取邻域最大值。使物体扩大,填充孔洞
                    # 等价于cv2.dilate(),但在morphologyEx中作为统一接口使用
                    # 典型应用:加粗文字、连接断裂部分、填充空隙
2.2相关参数介绍
复制代码
cv2.dilate() 膨胀函数参数
cv2.erode() 腐蚀函数参数
np.ones((3,3), np.uint8):创建一个3×3的全1矩阵作为结构元素
iterations=2:形态学操作的迭代次数,次数越多效果越明显
fx=0.6, fy=0.6:分别在x和y方向缩放0.6倍

3.实例

3.1读取太阳图像并进行缩放
python 复制代码
import cv2
import numpy as np

# 读取太阳图像并进行缩放
sun1 = cv2.imread('sun.png')  # 读取名为'sun.png'的图像文件
sun = cv2.resize(sun1, dsize=None, fx=0.6, fy=0.6)  # 将图像缩放为原图的60%
cv2.imshow('sun', sun)  # 显示缩放后的太阳图像
cv2.waitKey(0)  # 等待任意按键按下

# 腐蚀操作(去除毛刺)
kernel = np.ones((3, 3), np.uint8)  # 创建一个3x3的矩形结构元素
erode_1 = cv2.erode(sun, kernel, iterations=2)  # 对太阳图像进行腐蚀操作,迭代2次
cv2.imshow('er', erode_1)  # 显示腐蚀后的图像
cv2.waitKey(0)  # 等待任意按键按下
2.读取英语图像并进行缩放
python 复制代码
import cv2
import numpy as np
yingyu1 = cv2.imread('yingyu.png')  # 读取名为'yingyu.png'的图像文件
yingyu = cv2.resize(yingyu1, dsize=None, fx=0.6, fy=0.6)  # 将图像缩放为原图的60%
cv2.imshow('yingyu', yingyu)  # 显示缩放后的英语图像
cv2.waitKey(0)  # 等待任意按键按下

# 膨胀操作(加粗文字)
kernel = np.ones((2, 2), np.uint8)  # 创建一个2x2的矩形结构元素
dilate_1 = cv2.dilate(yingyu, kernel, iterations=2)  # 对英语图像进行膨胀操作,迭代2次
cv2.imshow('di', dilate_1)  # 显示膨胀后的图像
cv2.waitKey(0)  # 等待任意按键按下
3.读取有噪声的指纹图像并进行缩放
python 复制代码
import cv2
import numpy as np
zhiwennoise1 = cv2.imread('zhiwennoise.png')  # 读取名为'zhiwennoise.png'的图像文件
zhiwennoise = cv2.resize(zhiwennoise1, dsize=None, fx=0.8, fy=0.8)  # 将图像缩放为原图的80%
cv2.imshow('zhiwennoise', zhiwennoise)  # 显示缩放后的有噪声指纹图像
cv2.waitKey(0)  # 等待任意按键按下

# 闭运算(去除指纹图像中的噪声)
kernel = np.ones((2, 2), np.uint8)  # 创建一个2x2的矩形结构元素
mornoise = cv2.morphologyEx(zhiwennoise, cv2.MORPH_CLOSE, kernel)  # 对有噪声指纹进行闭运算
cv2.imshow('mornoise', mornoise)  # 显示闭运算处理后的图像
cv2.waitKey(0)  # 等待任意按键按下
4.读取指纹图像并进行缩放
python 复制代码
import cv2
import numpy as np
zhiwen1 = cv2.imread('zhiwen.png')  # 读取名为'zhiwen.png'的图像文件
zhiwen = cv2.resize(zhiwen1, dsize=None, fx=0.8, fy=0.8)  # 将图像缩放为原图的80%
cv2.imshow('zhiwen', zhiwen)  # 显示缩放后的指纹图像
cv2.waitKey(0)  # 等待任意按键按下

# 闭运算(连接断开的指纹纹路)
kernel = np.ones((2, 2), np.uint8)  # 创建一个2x2的矩形结构元素
mor = cv2.morphologyEx(zhiwen, cv2.MORPH_CLOSE, kernel)  # 对指纹图像进行闭运算
cv2.imshow('mor', mor)  # 显示闭运算处理后的图像
cv2.waitKey(0)  # 等待任意按键按下

cv2.destroyAllWindows()  # 关闭所有显示窗口
5.梯度运算:膨胀-腐蚀
复制代码
作用:突出显示图像中强度变化剧烈的地方
python 复制代码
import cv2
import numpy as np


yingyu1 = cv2.imread('yingyu.png')
yingyu = cv2.resize(yingyu1, dsize=None, fx=0.6, fy=0.6)
cv2.imshow('wenzi', yingyu)
cv2.waitKey(0)

kernel = np.ones((2,2), np.uint8) #设置kenene1太少

# 膨胀
pz_yingyu = cv2.dilate(yingyu1, kernel, iterations=1)
cv2.imshow('pz_yingyu', pz_yingyu)
cv2.waitKey(0)

# 腐蚀
fs_yingyu = cv2.erode(yingyu, kernel, iterations=1)
cv2.imshow('fs_yingyu', fs_yingyu)
cv2.waitKey(0)

# 膨胀-腐蚀
pz_fs = cv2.morphologyEx(yingyu, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('pz_fsyingyu', pz_fs)
cv2.waitKey(0)
6.顶帽和黑帽
复制代码
顶帽 = 原始图像 - 开运算结果(先腐蚀后膨胀)  用于提取比周围区域亮的细节。
黑帽 = 闭运算(先膨胀后腐蚀) - 原始图像  用于提取比周围区域暗的细节。
python 复制代码
import cv2
import numpy as np
sun1= cv2.imread('sun.png')
sun = cv2.resize(sun1, dsize=None, fx=0.6, fy=0.6)
cv2.imshow('sun_yuan', sun)
cv2.waitKey(0)

kernel = np.ones((2,2), np.uint8) #设置kenene1太少

# 开运算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow('open_sun', open_sun)
cv2.waitKey(0)

# 顶帽
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)

# 闭运算
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow('close_sun', close_sun)
cv2.waitKey(0)

# 黑帽
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
相关推荐
Study9962 小时前
大语言模型的详解与训练
人工智能·ai·语言模型·自然语言处理·大模型·llm·agent
CoovallyAIHub2 小时前
YOLO-Maste开源:首个MoE加速加速实时检测,推理提速17.8%!
深度学习·算法·计算机视觉
深蓝海拓2 小时前
PySide6,QEventLoop.exec()的使用
笔记·python·qt·学习·pyqt
中等生2 小时前
Fastapi中的 lifespan
python
小北方城市网2 小时前
微服务架构设计实战指南:从拆分到落地,构建高可用分布式系统
java·运维·数据库·分布式·python·微服务
winfredzhang2 小时前
自动化从文本到目录:深度解析 Python 文件结构管理工具
python·ai·nodejs·文件结构
予枫的编程笔记2 小时前
【Java进阶】深入浅出 Java 锁机制:从“单身公寓”到“交通管制”的并发艺术
java·人工智能·
科技云报道2 小时前
科技云科技云报到:RPA+Agent,为什么可以1+1>2?
人工智能·科技
SEO_juper2 小时前
应对 AI 概览导致的网站流量流失:诊断、优化与长期策略
人工智能·seo·数字营销