pythonOpenCV篇:0基础带你python入门之常用函数
2024/12/21 23:56:07
来源:https://blog.csdn.net/qq_63627943/article/details/144407582
浏览:
次
关键词:pythonOpenCV篇:0基础带你python入门之常用函数
① 二值化函数
- 功能:将图像转换为二值图像(黑白图像),将像素值分为两种类别:前景(白)和背景(黑)。
- 函数:
cv2.threshold()
- 参数:
src
:输入图像(通常为灰度图像)。thresh
:阈值值,用于将像素分割为前景和背景。maxval
:满足条件的像素值赋值为此值(通常为255)。type
:阈值类型,例如: cv2.THRESH_BINARY
:大于阈值的像素赋值为maxval
,否则为0。cv2.THRESH_BINARY_INV
:反向二值化。cv2.THRESH_TRUNC
:大于阈值的像素赋值为阈值,其余保持不变。cv2.THRESH_TOZERO
:小于阈值的像素赋值为0。cv2.THRESH_TOZERO_INV
:大于阈值的像素赋值为0。
- 返回值:
retval
:实际使用的阈值(当选择 Otsu 或自适应阈值时有意义)。dst
:二值化后的图像。
- 应用:目标检测、边缘检测、文档处理等。
- 代码:
import cv2# 读取图像文件
img = cv2.imread("./lena.png") # 从当前目录读取名为 "lena.png" 的图像文件
cv2.imshow("flower", img) # 显示原始图像,窗口标题为 "flower"# 将彩色图像转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用 OpenCV 的颜色转换函数,将图像从 BGR 转为灰度
cv2.imshow("gray", img_gray) # 显示灰度图像,窗口标题为 "gray"# 设置二值化的阈值
thresh = 120 # 阈值设为 120,低于该值的像素归为 0,高于该值的像素归为 255# 手动实现基于阈值的二值化
img_binary = img_gray # 将灰度图赋值给新的变量 img_binary
for i in range(img_gray.shape[0]): # 遍历图像的每一行for j in range(img_gray.shape[1]): # 遍历图像的每一列if img_binary[i][j] <= thresh: # 如果像素值小于等于阈值pass # 此处原本应该将像素值设为 0,但被注释掉了(什么都不做)# img_binary[i][j] = 0 # 手动将像素值设置为 0else: # 如果像素值大于阈值img_binary[i][j] = 255 # 手动将像素值设置为 255(白色)# 使用 OpenCV 自带的阈值函数实现二值化(此部分代码被注释掉)
# ret, img_binary = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 说明:
# ret:实际使用的阈值(当使用 Otsu 方法时,自动计算得到)。
# img_binary:二值化后的图像。
# cv2.THRESH_BINARY:普通二值化,像素值高于阈值设为最大值(255),否则为 0。
# cv2.THRESH_OTSU:自动计算全局最佳阈值。# 显示二值化后的图像
cv2.imshow("threshold ", img_binary) # 显示手动二值化后的图像,窗口标题为 "threshold"# 等待用户按键,随后关闭窗口
cv2.waitKey(0) # 等待用户按下任意键,不限制时间
② 自适应二值化函数
- 功能:对光照不均匀的图像进行二值化,使用局部区域的统计信息来计算阈值。
- 函数:
cv2.adaptiveThreshold()
- 参数:
src
:输入图像(必须是灰度图)。maxValue
:满足条件的像素值赋值为此值(通常为255)。adaptiveMethod
:自适应阈值计算方法: cv2.ADAPTIVE_THRESH_MEAN_C
:取邻域均值作为阈值。cv2.ADAPTIVE_THRESH_GAUSSIAN_C
:取邻域高斯加权均值作为阈值。
thresholdType
:阈值类型(通常为 cv2.THRESH_BINARY
或 cv2.THRESH_BINARY_INV
)。blockSize
:邻域大小(必须为奇数)。C
:常量,用于调整阈值结果。
- 返回值:
- 应用:场景文字检测、身份证/票据识别、医学影像处理。
- 代码:
import cv2 # 导入 OpenCV 库,用于图像处理# 读取图像
image = cv2.imread("./lena.png") # 从当前目录读取名为 "lena.png" 的图像文件(彩色图像)
# cv2.imshow("flower", image) # 如果需要显示原图,可以取消注释此行,窗口标题为 "flower"# 将彩色图像转换为灰度图像
img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 使用 OpenCV 的颜色转换函数,将 BGR 彩色图像转为灰度图像
cv2.imshow("gray", img_gray) # 显示灰度图像,窗口标题为 "gray"# 使用 Otsu 方法进行全局阈值化
ret, img_binary = cv2.threshold(img_gray, # 输入图像,必须是灰度图像200, # 手动设置的初始阈值(Otsu 会自动调整,此值会被忽略)255, # 满足条件的像素值设置为 255cv2.THRESH_BINARY + cv2.THRESH_OTSU # 二值化模式为 Otsu 和普通二值化的组合
)
# cv2.imshow("threshold", img_binary) # 如果需要显示 Otsu 二值化结果,可以取消注释此行,窗口标题为 "threshold"# 使用自适应二值化方法
image_np_adaptive = cv2.adaptiveThreshold(img_gray, # 输入图像,必须是灰度图像255, # 满足条件的像素值设置为 255cv2.ADAPTIVE_THRESH_GAUSSIAN_C, # 使用高斯加权的邻域均值来计算局部阈值cv2.THRESH_BINARY, # 二值化模式为普通二值化7, # 邻域大小(blockSize),必须为奇数,例如 7 表示 7×7 的窗口5 # 常量 C,最终阈值为计算出的局部阈值减去 C
)
cv2.imshow("image_np_adaptive", image_np_adaptive) # 显示自适应二值化后的图像,窗口标题为 "image_np_adaptive"# 等待用户按键,随后关闭所有窗口
cv2.waitKey(0) # 等待用户按下任意键,不限制时间
③ 腐蚀函数
- 功能:减少图像中的白色区域(前景),去除小的噪声点或断开小的连接。
- 函数:
cv2.erode()
- 参数:
src
:输入图像(二值图像或灰度图像)。kernel
:结构元素(形状和大小由 cv2.getStructuringElement()
定义)。iterations
:腐蚀操作的次数。
- 返回值:
- 应用:去除噪声、边缘提取、分离连通物体等。
- 代码:
import cv2 # 导入 OpenCV 库,用于图像处理# 读取图像
image_binary = cv2.imread("./morph.png") # 从当前目录读取名为 "morph.png" 的图像文件
# 注意:这里假设图像是二值图像(黑白图像),如果图像是彩色或灰度图,需要先进行预处理。# 创建结构元素(内核)
image_1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, # 内核形状为椭圆(10, 10) # 内核大小为 10×10 像素
)
# 说明:
# `cv2.getStructuringElement()` 用于创建形态学操作的结构元素(内核)。
# 参数 `cv2.MORPH_ELLIPSE` 表示使用椭圆形内核。其他可选形状包括:
# - `cv2.MORPH_RECT`:矩形
# - `cv2.MORPH_CROSS`:交叉形
# 内核的大小对形态学操作的结果影响很大,较大的内核会产生更显著的效果。# 使用腐蚀操作处理图像
image_erode = cv2.erode(image_binary, # 输入图像,通常为二值图像image_1 # 结构元素(内核)
)
# 说明:
# `cv2.erode()` 是 OpenCV 的腐蚀函数,用于减少图像中前景(白色区域)的面积。
# 通过结构元素内核,腐蚀操作会移除边缘上的白色像素。
# 对于 10×10 的椭圆内核,腐蚀操作会缩小前景区域,并去除小的噪声。# 显示腐蚀后的图像
cv2.imshow("image_erode", image_erode) # 显示腐蚀后的图像,窗口标题为 "image_erode"# 显示原始图像
cv2.imshow("image_binary", image_binary) # 显示原始图像,窗口标题为 "image_binary"# 等待用户按键后关闭窗口
cv2.waitKey(0) # 等待用户按下任意键
④ 膨胀函数
- 功能:增加图像中的白色区域(前景),填补断裂的区域或小孔。
- 函数:
cv2.dilate()
- 参数:
src
:输入图像(二值图像或灰度图像)。kernel
:结构元素。iterations
:膨胀操作的次数。
- 返回值:
- 应用:增强物体区域、填充空隙、形态学处理等。
- 代码:
import cv2 # 导入 OpenCV 库,用于图像处理# 读取图像
image_binary = cv2.imread("./lena.png") # 从当前目录读取名为 "lena.png" 的图像文件(彩色图像)# 将彩色图像转换为灰度图像
image_gray = cv2.cvtColor(image_binary, cv2.COLOR_BGR2GRAY) # 使用 OpenCV 的颜色转换函数,将 BGR 图像转为灰度图像# 自适应二值化
image_np_adaptive = cv2.adaptiveThreshold(image_gray, # 输入灰度图像255, # 满足条件的像素值设置为 255cv2.ADAPTIVE_THRESH_GAUSSIAN_C, # 使用高斯加权的邻域均值计算局部阈值cv2.THRESH_BINARY, # 二值化模式为普通二值化7, # 邻域大小(blockSize),必须是奇数,这里为 7×7 的窗口5 # 常量 C,用于调整阈值(阈值 = 局部均值 - C)
)
# 自适应二值化适用于光照不均匀的图像处理。参数 `blockSize` 和 `C` 会直接影响二值化结果。# 创建形态学操作的结构元素(内核)
kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, # 内核形状为椭圆形(4, 4) # 内核大小为 4×4 像素
)
# 注意:较小的内核会对图像做出细微的形态学改变,较大的内核会显著改变图像形状。# 腐蚀操作
image_erode = cv2.erode(image_np_adaptive, # 输入二值图像(经过自适应二值化的图像)kernal # 使用的内核
)
# `cv2.erode()` 会减少前景(白色区域)的面积,移除边缘上的噪声点或小的白色区域。
# 腐蚀操作通常用于消除小噪声或分离相连的物体。# 膨胀操作
image_erode_dilate = cv2.dilate(image_erode, # 输入图像(已经腐蚀过的图像)kernal # 使用的内核
)
# `cv2.dilate()` 会增加前景(白色区域)的面积,填充空洞或连接断裂的部分。
# 腐蚀和膨胀结合使用可以实现开运算(消除小噪声)或闭运算(填补小空洞)。# 显示腐蚀后的图像
cv2.imshow("image_erode", image_erode) # 显示腐蚀处理后的图像,窗口标题为 "image_erode"# 显示原始彩色图像
cv2.imshow("image_binary", image_binary) # 显示原始图像,窗口标题为 "image_binary"# 显示腐蚀后再膨胀的图像
cv2.imshow("image_erode_dilate", image_erode_dilate) # 显示膨胀处理后的图像,窗口标题为 "image_erode_dilate"# 等待用户按键后关闭窗口
cv2.waitKey(0) # 等待用户按下任意键,窗口保持打开
⑤ 仿射变换函数
- 功能:对图像进行线性变换,如旋转、缩放、平移等。
- 函数:
cv2.warpAffine()
- 参数:
src
:输入图像。M
:2x3 的仿射变换矩阵(通过 cv2.getAffineTransform()
生成)。dsize
:输出图像的尺寸(宽度和高度)。flags
:插值方法(如 cv2.INTER_LINEAR
)。borderMode
和 borderValue
:用于处理边界像素。
- 返回值:
- 应用:图像旋转、缩放、平移、视角调整等。
- 代码:
import numpy as np # 导入 NumPy,用于数值计算(此处未使用,但是常见的图像处理工具库)
import cv2 # 导入 OpenCV 库,用于图像处理# 读取图像
image_binary = cv2.imread("./lena.png") # 从当前目录读取名为 "lena.png" 的图像文件(彩色图像)# 将彩色图像转换为灰度图像
image_gray = cv2.cvtColor(image_binary, cv2.COLOR_BGR2GRAY) # 使用 OpenCV 的颜色转换函数,将 BGR 图像转为灰度图像# 自适应二值化
image_np_adaptive = cv2.adaptiveThreshold(image_gray, # 输入灰度图像255, # 满足条件的像素值设置为 255cv2.ADAPTIVE_THRESH_GAUSSIAN_C, # 使用高斯加权的邻域均值计算局部阈值cv2.THRESH_BINARY, # 二值化模式为普通二值化7, # 邻域大小(blockSize),必须是奇数,这里为 7×7 的窗口5 # 常量 C,用于调整阈值(阈值 = 局部均值 - C)
)
# 自适应二值化适用于光照不均匀的图像处理。参数 `blockSize` 和 `C` 会直接影响二值化结果。# 创建形态学操作的结构元素(内核)
kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, # 内核形状为椭圆形(4, 4) # 内核大小为 4×4 像素
)
# 注意:较小的内核会对图像做出细微的形态学改变,较大的内核会显著改变图像形状。# 腐蚀操作
image_erode = cv2.erode(image_np_adaptive, # 输入二值图像(经过自适应二值化的图像)kernal # 使用的内核
)
# `cv2.erode()` 会减少前景(白色区域)的面积,移除边缘上的噪声点或小的白色区域。
# 腐蚀操作通常用于消除小噪声或分离相连的物体。# 膨胀操作
image_erode_dilate = cv2.dilate(image_erode, # 输入图像(已经腐蚀过的图像)kernal # 使用的内核
)
# `cv2.dilate()` 会增加前景(白色区域)的面积,填充空洞或连接断裂的部分。
# 腐蚀和膨胀结合使用可以实现开运算(消除小噪声)或闭运算(填补小空洞)。# 显示腐蚀后的图像
cv2.imshow("image_erode", image_erode) # 显示腐蚀处理后的图像,窗口标题为 "image_erode"# 显示原始彩色图像
cv2.imshow("image_binary", image_binary) # 显示原始图像,窗口标题为 "image_binary"# 显示腐蚀后再膨胀的图像
cv2.imshow("image_erode_dilate", image_erode_dilate) # 显示膨胀处理后的图像,窗口标题为 "image_erode_dilate"# 等待用户按键后关闭窗口
cv2.waitKey(0) # 等待用户按下任意键,窗口保持打开
⑥ 透视变换函数
- 功能:对图像进行透视变换,从一个视角映射到另一个视角,校正倾斜图像或提取局部内容。
- 函数:
cv2.warpPerspective()
- 参数:
src
:输入图像。M
:3x3 的透视变换矩阵(通过 cv2.getPerspectiveTransform()
生成)。dsize
:输出图像的尺寸。flags
、borderMode
和 borderValue
:与仿射变换类似。
- 返回值:
- 应用:文档矫正、车牌识别、场景理解等。
- 代码:
import cv2 # 导入 OpenCV 库,用于图像处理
import numpy as np # 导入 NumPy 库,用于数组操作# 读取图像
image = cv2.imread("./card.png") # 从当前目录中读取名为 "card.png" 的图像文件# 检查图像是否成功加载
if image is None: # 如果图像加载失败print("Error: Image not found. Please check the file path.") # 输出错误信息exit() # 终止程序# 定义原图中的四个点和目标点
point1 = np.array([[200, 100], [700, 150], [140, 400], [650, 460]], dtype=np.float32)
# 说明:
# `point1` 是原始图像中感兴趣区域(ROI)的四个顶点,表示需要校正的区域。
# 每个点用 (x, y) 坐标表示。
# 例如,(200, 100) 表示原图中左上角的一个点。point2 = np.array([[0, 0], [image.shape[1], 0], [0, image.shape[0]], [image.shape[1], image.shape[0]]], dtype=np.float32)
# 说明:
# `point2` 是透视变换后图像的目标点,定义了变换后的矩形区域。
# (0, 0) 是左上角,(image.shape[1], 0) 是右上角,依次类推。
# `image.shape[1]` 表示图像宽度,`image.shape[0]` 表示图像高度。# 获取透视变换矩阵
M = cv2.getPerspectiveTransform(point1, point2)
# 说明:
# `cv2.getPerspectiveTransform()` 函数计算透视变换矩阵。
# 参数:
# - `point1`:原始图像中的四个点。
# - `point2`:目标图像中的四个点。
# 返回值:
# - `M` 是一个 3x3 的透视变换矩阵。# 进行透视变换
image_s = cv2.warpPerspective(image, M, (image.shape[1], image.shape[0]))
# 说明:
# `cv2.warpPerspective()` 函数对图像应用透视变换。
# 参数:
# - `image`:输入图像。
# - `M`:透视变换矩阵。
# - `(image.shape[1], image.shape[0])`:输出图像的大小(宽度、高度)。
# 返回值:
# - `image_s` 是经过透视变换后的图像。# 显示原图和矫正后的图像
cv2.imshow("Original Image", image) # 显示窗口标题为 "Original Image" 的原始图像
cv2.imshow("Corrected Image", image_s) # 显示窗口标题为 "Corrected Image" 的矫正后图像# 等待按键关闭窗口
cv2.waitKey(0) # 等待用户按下任意键后关闭所有窗口
cv2.destroyAllWindows() # 销毁所有窗口
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com