图片缩放
# 指定大小 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() 复制代码
网络异常,图片无法展示
|