① 二值化函数
-
功能:将图像转换为二值图像(黑白图像),将像素值分为两种类别:前景(白)和背景(黑)。
-
函数 :
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 # 手动将像素值设置为 0 else: # 如果像素值大于阈值 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
:常量,用于调整阈值结果。
-
返回值 :
dst
:自适应二值化后的图像。
-
应用:场景文字检测、身份证/票据识别、医学影像处理。
-
代码:
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, # 满足条件的像素值设置为 255 cv2.THRESH_BINARY + cv2.THRESH_OTSU # 二值化模式为 Otsu 和普通二值化的组合 ) # cv2.imshow("threshold", img_binary) # 如果需要显示 Otsu 二值化结果,可以取消注释此行,窗口标题为 "threshold" # 使用自适应二值化方法 image_np_adaptive = cv2.adaptiveThreshold( img_gray, # 输入图像,必须是灰度图像 255, # 满足条件的像素值设置为 255 cv2.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
:腐蚀操作的次数。
-
返回值 :
dst
:腐蚀后的图像。
-
应用:去除噪声、边缘提取、分离连通物体等。
-
代码:
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
:膨胀操作的次数。
-
返回值 :
dst
:膨胀后的图像。
-
应用:增强物体区域、填充空隙、形态学处理等。
-
代码:
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, # 满足条件的像素值设置为 255 cv2.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
:用于处理边界像素。
-
返回值 :
dst
:变换后的图像。
-
应用:图像旋转、缩放、平移、视角调整等。
-
代码:
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, # 满足条件的像素值设置为 255 cv2.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
:与仿射变换类似。
-
返回值 :
dst
:透视变换后的图像。
-
应用:文档矫正、车牌识别、场景理解等。
-
代码:
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() # 销毁所有窗口