Skip to Content

图像控制

读取图像

  • cv.imread()
(function) def imread( filename: str, // 文件路径(注意不要包含中文) flags: int = 1 | 0 | -1 // 彩色(不含alpha通道) | 灰度 | 彩色 ) -> MatLike

显示图像

  • cv.imshow():会自动创建窗口并在其中显示图像
(function) def imshow( winname: str, // 窗口名称 mat: MatLike //读取的图片链接 ) -> None

保存图像

  • cv.imwrite():图像保存在工作目录
(function) def imwrite( filename: str, // 保存后的图像命名 img: MatLike, // 要保存图像 params: Sequence[int] = ... ) -> bool

图像属性

  • img.shape:获取图片尺寸
h,w,c = img.shape // 高度,宽度,通道数
  • img[h,w ?,c]:获取图片像素在(w,h)处c通道的颜色信息,读取顺序为B,G,R
  • img[h1:h2,w1:w2]:获取图片像素在(w1:w2,h1:h2)处所有颜色信息
  • img[:,:,c]:获取所有图片像素在c通道的颜色信息
  • img.size:获取图片像素数量
  • img.dtype:获取图像数据类型

图像操作

  • cv.resize():改变图像大小
  • cv.spilt():拆分图像通道
(function) def split( m: MatLike, mv: Sequence[MatLike] | None = ... ) -> Sequence[MatLike]
  • cv.merge():合并图像通道
(function) def merge( mv: Sequence[MatLike], dst: MatLike | None = ... ) -> MatLike
  • cv.addWeighted():融合图像
  • cv.copyMakeBorder():对图像进行边界填充
  • np.hstack:图像水平堆叠

图像处理

色彩空间转化

  • cv.cvtColor()
  • HSV:容易跟踪某种颜色的物体,常用于分割指定颜色的物体
    • Hue(色调、色相)
    • Saturation(饱和度、色彩纯净度)
    • Value(明度)

阈值处理

  • 功能:加强图像特定部分
  • cv.threshold()

图像平滑

  • cv.blur:均值滤波
  • cv.boxFilter:盒式滤波
  • cv.GaussianBlur:高斯滤波
  • cv.medianBlur:中值滤波

形态学操作

  • 腐蚀:去除边界点,图像变暗
    • cv.erode()
  • 膨胀:扩张边界点,图像变亮
    • cv.dilate()
  • 开操作:先腐蚀后膨胀,去除噪点,平滑轮廓
    • cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
  • 闭操作:先膨胀后腐蚀,填充小洞,连接近邻轮廓
    • cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
  • 梯度:膨胀-腐蚀,显示边缘轮廓
    •  cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
  • 顶帽:原图像 - 开操作,突出比原图更亮的区域
    • cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
  • 黑帽:闭操作 - 原图像,突出比原图更暗的区域
    • cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
# 读取图像 img = cv.imread("D:/pic/113220184_touxiang_bobopic.jpg", cv.IMREAD_GRAYSCALE) # 创建结构元素 kernel = np.ones((5,5),np.uint8) # 形态学操作 erosion = cv.erode(img, kernel, iterations = 1) # 腐蚀 dilation = cv.dilate(img, kernel, iterations = 1) # 膨胀 opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel) # 开运算 (先腐蚀后膨胀) closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel) # 闭运算 (先膨胀后腐蚀) gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel) # 形态学梯度(膨胀-腐蚀) tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel) # 顶帽(原图像-开操作) blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)# 黑帽(闭操作-原图像) # 创建显示窗口 plt.figure(figsize=(12,8)) titles = ['Original', 'Erosion', 'Dilation', 'Opening', 'Closing', 'Gradient', 'Top Hat', 'Black Hat'] images = [img, erosion, dilation, opening, closing, gradient, tophat, blackhat] # 使用subplot显示所有结果 for i in range(8): plt.subplot(2,4,i+1) plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()

边缘检测

  • Sobel 算子:计算图像中每个像素点的梯度值来检测边缘
    • cv.Sobel()
  • Scharr 算子:对 Sobel 算子的改进,通过加权平均来增强梯度计算的效果
    • cv.Scharr()
  • Canny 边缘检测:多阶段的边缘检测算法,旨在检测图像中最显著的边缘,同时减少噪声影响
    • cv.Canny()
  • Laplacian of Gaussian (LoG) 算法:结合了高斯滤波和平滑处理,首先对图像进行高斯平滑,然后使用拉普拉斯算子(Laplacian)计算图像的二阶导数,找出灰度变化率最大的点
    • cv.Laplacian()
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=3) # x方向梯度 sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=3) # y方向梯度 sobelx = cv.convertScaleAbs(sobelx) # 梯度值转换为绝对值,并转换为8位无符号整数类型 sobely = cv.convertScaleAbs(sobely) sobelxy = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0) # 将x方向和y方向的梯度图像按照0.5的权重进行融合 scharrx = cv.Scharr(img, cv.CV_64F, 1, 0) scharry = cv.Scharr(img, cv.CV_64F, 0, 1) scharrx = cv.convertScaleAbs(scharrx) scharry = cv.convertScaleAbs(scharry) scharrxy = cv.addWeighted(scharrx, 0.5, scharry, 0.5, 0) laplacian = cv.Laplacian(img, cv.CV_64F) laplacian = cv.convertScaleAbs(laplacian) canny = cv.Canny(img, 100, 200)

图像金字塔

图像轮廓

窗口控制

创建窗口

  • cv.namedWindow()
(function) def namedWindow( winname: str, //窗口名称 flags: int = cv.WINDOW_NORMAL | cv.WINDOW_AUTOSIZE ... // 可调整大小 | 图片原尺寸 ) -> None

销毁窗口

  • cv.destroyAllWindows():销毁所有窗口
  • cv.destroyWindow(): 销毁指定窗口
(function) def destroyWindow(winname: str) -> None

交互控制

键盘交互

  • cv.waitKey():阻塞函数,等待获取用户键盘输入
(function) def waitKey(delay: int = ...) -> int // 程序等待时间,输入`0`一直等待,单位毫秒
Last updated on