opencv常见方法参数说明参考

267 阅读3分钟

后续学习函数持续补充中

图片缩放

# 指定大小
img = cv.resize(img,(600,700),interpolation = cv.INTER_CUBIC)
# 按照比例
img = cv.resize(img,None,fx=0.2, fy=0.2, interpolation = cv.INTER_CUBIC)

形态学 morphologyEx

# 卷积核定义
'''
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
'''
rectKernel = cv.getStructuringElement(cv.MORPH_RECT, (24, 24))
'''
    MORPH_ERODE    = 0, //腐蚀 跟erode(腐蚀)函数效果一样
    MORPH_DILATE   = 1, //膨胀 跟dilate(膨胀)函数效果一样
    MORPH_OPEN     = 2, //开操作 先腐蚀后膨胀的 消除噪点
    MORPH_CLOSE    = 3, //闭操作 先膨胀后腐蚀 
    MORPH_GRADIENT = 4, //梯度操作
    MORPH_TOPHAT   = 5, //顶帽(礼帽)操作 用原始图像减去其开运算图像的操作 提取噪点
    MORPH_BLACKHAT = 6, //黑帽操作 闭运算减去原始图像的操作
    MORPH_HITMISS  = 7
'''    
gradX = cv.morphologyEx(gray, cv.MORPH_OPEN, rectKernel)

HoughLines

-   img 为输入的图像,Canny提取后的边界数据
-   rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0
-   theta: 线段以弧度为单位的角度精度,推荐用np.pi/180
-   threshold int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用200试试

# 直线检测 这里注意如果图像的大小太小的时候是检测不到的 可以采用图像的放大操作
lines = cv.HoughLines(edges,1,np.pi/180,200)

# 画线操作
for line in lines:
    rho,theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)

HoughLinesP

# minLineLength:线段以像素为单位的最小长度,根据应用场景设置
# maxLineGap:最大间隔,有默认值0,允许将同一行点与点之间连接起来的最大的距离

lines = cv.HoughLinesP(edges,1,np.pi/180,100,minLineLength=180,maxLineGap=90)
for line in lines:
    x1,y1,x2,y2 = line[0]
    cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)

Canny

# 边缘检测
'''
第一个参数是我们的输入图像。
第二个和第三个参数分别是我们的 minVal 和 maxVal。一般情况最大值为最小值的3被
第三个参数是 aperture_size。它是用于查找图像渐变的 Sobel 内核的大小。默认情况下,它是 3.
最后一个参数是 L2gradient,它指定用于查找梯度幅度的等式。如果它是 True,
它使用上面提到的更准确的等式,否则它使用这个函数: $$ Edge_Gradient ; (G) = |G_x| + |G_y| $$ 
默认情况下,它为 False。
'''
当图像的灰度梯度大于 maxVal 时,其为是真的边界.
那些低于 minVal 的边界会被抛弃. 
如果介于两者之间的,就看这个点是否与某个被确定为真正的边界点相连; 如果是就认为它也是边界点;如果不是,就抛弃.

edges = cv.Canny(gradX,50,150,apertureSize = 3)

棋盘效果图

import cv2 as cv
import numpy as np
import math
from scipy import misc, ndimage

# xq001.jpg xq002.jpg
input_path = 'E:/opencv4.4.0/age-and-gender-classification/img/xq002.jpg'
img = cv.imread(input_path)
img = cv.resize(img,None,fx=0.2, fy=0.2, interpolation = cv.INTER_CUBIC)
cv.imshow("xq",img)

gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

#内核比较大主要是为了去掉边界的干扰
rectKernel = cv.getStructuringElement(cv.MORPH_RECT, (24, 24))

gradX = cv.morphologyEx(gray, cv.MORPH_OPEN, rectKernel)
cv.imshow('gradX2',gradX)

edges = cv.Canny(gradX,50,150,apertureSize = 3)
cv.imshow("edges", edges)

lines = cv.HoughLines(edges,1,np.pi/180,200)

for line in lines:
    rho,theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)

cv.imshow('houghlines3.jpg',img)

k = cv.waitKey(0)
if k == 27:
   cv.destroyAllWindows()

image.png