一、边界填充
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()
补充说明:
-
cv2.copyMakeBorder()函数的value参数颜色顺序是BGR(蓝、绿、红),而不是RGB -
cv2.BORDER_REFLECT和cv2.BORDER_REFLECT101的区别在于边界像素是否被重复使用 -
在OpenCV中,按
Esc键可以快速关闭当前显示的图像窗口 -
如果图片路径不正确或图片不存在,程序可能会报错

二、图像形态学
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()
