Python OpenCV 图像与视频处理实战指南

山间有风
山间有风
发布时间:2026-10-14 | 2人浏览过
原创

本文深入解析 Python OpenCV 的核心操作,涵盖图片与灰度图的读取、视频流处理、图像裁剪、RGB 通道分离、边界填充、图像融合与缩放变换,以及二值化阈值处理。通过具体代码示例展示各功能的实现细节与参数配置,适用于图像预处理及计算机视觉入门学习。

图像读取与显示基础

使用 OpenCV 读取并显示原始图片。通过 cv.imread 加载指定路径的文件,获取图像形状信息后,利用 cv.imshow 展示图像窗口,并通过 cv.waitKey(0) 等待用户按键,最后使用 cv.destroyAllWindows 关闭所有窗口。


def display_img(file="p.jpeg"):
  img = cv.imread(file)
  print (img.shape)
  cv.imshow('image',img)
  cv.waitKey(0)
  cv.destroyAllWindows()

灰度图像加载与保存

读取并处理灰度图片。在 cv.imread 中指定 cv.IMREAD_GRAYSCALE 参数以直接加载为灰度图像。获取形状后显示图像,并使用 cv.imwrite 将处理后的灰度图像保存为指定文件名(如 gray_img.png)。


def display_gray_img(file="p.jpeg"):
  img = cv.imread(file,cv.IMREAD_GRAYSCALE)
  print (img.shape)
  cv.imshow('image',img)
  cv.waitKey(0)
  cv.destroyAllWindows()
  cv.imwrite("gray_img.png",img)

视频流读取与逐帧处理

读取并处理视频文件。使用 cv.VideoCapture 打开视频文件,检查是否成功打开。在循环中逐帧读取视频,若读取失败则跳出循环。对每一帧进行灰度转换后显示,并通过 cv.waitKey 设置延时,当检测到 ESC 键(ASCII 27)时退出循环。最后释放视频捕获对象并销毁窗口。


def display_video(file="sj.mp4"):
  v = cv.VideoCapture(file)
  if v.isOpened():
    open,frame = v.read()
  else:
    open=False

  while open:
    ret,frame = v.read()
    if frame is None:
      break
  
    if ret == True:
      gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
      cv.imshow("result",gray)
      if cv.waitKey(10) & 0xFF == 27:
        break
  v.release()
  v.waitKey(0)
  v.destroyAllWindows()

图像区域裁剪技巧

截取图像特定区域。加载图像后,通过数组切片操作提取图像的左上角 200x200 像素区域。将该裁剪后的图像显示在新窗口中,等待按键后关闭所有窗口。


def get_frame_img(file="p.jpeg"):
  img = cv.imread(file)
  print (img.shape)
  cat = img[0:200,0:200]
  cv.imshow('get_frame_img',cat)
  cv.waitKey(0)
  cv.destroyAllWindows()

RGB 通道分离与重组

提取并分离 RGB 通道。加载图像后,使用 cv.split 将图像分解为蓝、绿、红三个单通道图像。打印各通道形状后,使用 cv.merge 重新合并为原图像以验证形状。接着,分别创建三个副本,通过置零其他通道的方式单独显示红色、绿色和蓝色通道的视觉效果。


def extrats_rgb_img(file="p.jpeg"):
  img = cv.imread(file)
  b,g,r = cv.split(img)
  print (b.shape,g.shape,r.shape)
  new_img = cv.merge((b,g,r))
  print (new_img.shape)

  copy_img_r = img.copy()
  copy_img_r[:,:,0]=0
  copy_img_r[:,:,1]=0
  cv.imshow("r_img",copy_img_r)

  copy_img_g = img.copy()
  copy_img_g[:,:,0]=0
  copy_img_g[:,:,2]=0
  cv.imshow("g_img",copy_img_g)

  copy_img_b = img.copy()
  copy_img_b[:,:,1]=0
  copy_img_b[:,:,2]=0
  cv.imshow("b_img",copy_img_b)

图像边界填充算法

应用多种边界填充算法。定义五种边界类型:复制法(BORDER_REPLICATE)、反射法(BORDER_REFLECT)、以边缘像素为轴的反射法(BORDER_REFLECT_101)、外包装法(BORDER_WRAP)和常量填充法(BORDER_CONSTANT)。设置上下左右各 50 像素的填充大小,对原始图像应用上述五种填充方式,并使用 matplotlib 绘制子图展示原始图像及五种填充后的结果。


def border_fill_img(file="p.jpeg"):
  border_type = [
    cv.BORDER_REPLICATE,#复制法,复制边缘
    cv.BORDER_REFLECT, #反射法,对感兴趣的图像中的像素在两边进行复制
    cv.BORDER_REFLECT_101,#反射法,以边缘像素为轴,对称
    cv.BORDER_WRAP,#外包装法
    cv.BORDER_CONSTANT#常量法,常量填充
    ]
  border_title = [
    "REPLICATE",
    "REFLECT",
    "REFLECT_101",
    "WRAP",
    "CONSTANT"
    ]
  img = cv.imread(file)
  top_size,bottom_size,left_size,right_size = (50,50,50,50)
  plt.subplot(231)
  plt.imshow(img,"gray")#原始图像
  plt.title("ORIGNAL")

  for i in range(len(border_type)):
    result = cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,border_type[i])
    plt.subplot(232+i)
    plt.imshow(result,"gray")
    plt.title(border_title[i])

  plt.show()

图像融合与几何变换

执行图像融合与几何变换。读取两张图像后,调整两者大小至 500x500。使用 cv.addWeighted 以 0.4 和 0.6 的权重进行图像叠加融合。随后,分别对两张图像进行非均匀缩放:一张沿 x 轴放大 3 倍(fx=3, fy=1),另一张沿 y 轴放大 3 倍(fx=1, fy=3),并展示变换后的结果。


def img_compose(file1="tu.jpeg",file2="gui.jpeg"):
  img_1 = cv.imread(file1)
  img_2 = cv.imread(file2)
  print (img_1.shape)
  print (img_2.shape)
  img_1= cv.resize(img_1,(500,500))
  img_2= cv.resize(img_2,(500,500))
  print (img_1.shape)
  print (img_2.shape)
  res = cv.addWeighted(img_1,0.4,img_2,0.6,0)
  plt.imshow(res)
  plt.show()


  res = cv.resize(img_1,(0,0),fx=3,fy=1)
  plt.imshow(res)
  plt.show()

  res = cv.resize(img_2,(0,0),fx=1,fy=3)
  plt.imshow(res)
  plt.show()

图像二值化处理

进行图像二值化处理。读取灰度图像后,设定阈值 limit 为 120。使用 cv2.threshold 函数,指定 cv2.THRESH_BINARY_INV 标志进行反向二值化处理,生成阈值图像。最后显示处理后的二值化图像并返回结果。


def Binarization(filepath):
  img = cv2.imread(filepath,0)
  limit = 120
  ret,thresh=cv2.threshold(img,limit,255,cv2.THRESH_BINARY_INV)
  plt.imshow(thresh,'gray')
  plt.show()
  return thresh
Binarization('t1.jpg')

本文介绍了 Python OpenCV 在图像与视频处理中的多项基础操作,包括读取、裁剪、通道分离、边界填充、融合变换及二值化。更多相关 Python OpenCV 内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表