后续学习函数持续补充中
图片缩放
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
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
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()
