Python之OpenCV2图像处理操作

图像读取与查看

  1. 读取图像: img=cv2.imread(ori)
  2. 查看图像:
    cv2.imshow("img",img)
    cv2.waitKey(0) #操作后关闭图像

图像预处理

  1. 图像灰度化: gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  2. 滤波(去除椒盐噪音):
    • 高斯滤波: blur=cv2.GaussianBlur(gray,(5,5),0)
    • 中值滤波: blur=cv2.medianBlur(gray,5)
  3. 图像二值化(将图像转化为黑白两种颜色方便图像处理): binary=cv2.adaptiveThreshold(~blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,35,-5) (自适应阈值二值化,~取反变为黑底白字的图像)

提取图像的特定颜色

  1. BGR转为HSV(H色调,S饱和度,V亮度): hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
  2. 设定待提取颜色的HSV范围:
    redLower=np.array([156, 43, 46])
    redUpper=np.array([179, 255, 255])
  3. 提取颜色(待提取颜色设为白色,其余颜色设为黑色): mask=cv2.inRange(hsv,redLower,redUpper)

形态学操作

  • 形态学操作的核: kernel=np.ones((1,18)) (保留横向的内容且少); kernel=np.ones((9,1)) (保留纵向的内容且多)
  • 腐蚀(黑色侵蚀): img_erosion=cv2.erode(binary,kernel,iterations=1)
  • 膨胀(白色膨胀): img_dilation=cv2.dilate(binary,kernel,iterations=1)
  • 开运算(先腐蚀后膨胀): img_open=cv2.morphologyEx(binary,cv2.MORPH_OPEN,kernel)
  • 闭运算(先膨胀后腐蚀): img_close=cv2.morphologyEx(binary,cv2.MORPH_CLOSE,kernel)

边缘检测

  • Canny算子: edge=cv2.Canny(binary,75,200)

轮廓检测

  • 轮廓检测: contours,hierachy=cv2.findContours(edge,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
  • 轮廓外接矩形: x,y,w,h=cv2.boundingRect(c)
  • 轮廓最小外接矩形:
    1
    2
    3
    rect=cv2.minAreaRect(c)
    box=cv2.boxPoints(rect)
    box=np.int0(box)
  • 轮廓多边形近似:
    1
    2
    3
    area=cv2.contourArea(c) #轮廓面积
    peri=cv2.arcLength(c,True) #轮廓周长
    approx=cv2.approxPolyDP(c,0.015*peri,True)
  • 轮廓绘制: cv2.drawContours(img,[box],0,(0,0,255),1) (参数:图像,轮廓,轮廓索引,颜色,线宽)

霍夫直线检测

1
2
3
lines=cv2.HoughLinesP(edge,1,np.pi/180,100,minLineLength=100,maxLineGap=10)
for line in lines:
x1,y1,x2,y2=line[0]

图像变换

  • 透视变换(将图像投射到一个新的视平面):

    1. 计算透视变换矩阵:
      1
      2
      3
      dst1=np.float32([[0,0],[maxWidth,0],[maxWidth,maxHeight],[0,maxHeight]])
      dst2=np.float32([[0,0],[maxWidth,0],[maxWidth,maxHeight],[0,maxHeight]])
      M=cv2.getPerspectiveTransform(dst1,dst2)
    2. 进行透视变换: warped=cv2.warpPerspective(img,M,(maxWidth,maxHeight)) (参数:图像,透视变换矩阵,输出图像尺寸)
  • 图像缩放:

    1
    2
    3
    height,width=img.shape #获取图像的高和宽
    res=cv2.resize(img,(int(0.8*width),int(0.8*height)),interpolation=cv2.INTER_LANCZOS4) #参数:图像,输出图像尺寸,插值方法
    res=cv2.resize(img,none,fx=2,fy=2,interpolation=cv2.INTER_LANCZOS4) #参数:图像,x轴比例因子,y轴比例因子,插值方法

图像裁剪

crop=img[y:y+h,x:x+w]

图像运算

  • 加法:
    added=cv2.add(img1,img2)
    added=img1+img2
  • 减法:
    subtracted=cv2.subtract(img1,img2)
    subtracted=img1-img2
  • 交集: bitwiseAnd=cv2.bitwise_and(img1,img2)
  • 并集: bitwiseOr=cv2.bitwise_or(img1,img2)
  • 取不重叠区域: bitwiseXor=cv2.bitwise_xor(img1,img2)
  • 取反: bitwiseNot=cv2.bitwise_not(img1,img2)

图像上绘制图形

  • 直线: cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)
  • 矩形: cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),cv2.FILLED) (cv2.FILLED为填充而非边框)
Author: Giftbear
Link: https://giftbear.github.io/2022/02/15/Python之OpenCV2图像处理操作/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.