OpenCV 功能函数介绍 (二)
一,梯度处理的sobel算子函数
功能:
用于计算图像梯度(gradient)的函数
参数:
cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=None)
cv2.Sobel(输入图像 , 应该是灰度化后的图像
输出图像的所需深度,:-1 来表示与输入图像相同的深度
x 方向上的导数阶数,如果你想要计算 x 方向上的梯度,设置这个参数为 1;如果你不关心 x 方向上的梯度,设置这个参数为 0。
y 方向上的导数阶数,同上
Sobel 核的大小,最好是1 3 5 7 9
)
返回值:
梯度化后的图片
应用:
import cv2
# 读取一张图
img = cv2.imread("./shudu.png")
# 使用sobel算子
# 水平梯度
img_sobel = cv2.Sobel(img, -1, 0, 1, ksize=3)
# 垂直梯度
img_sobel_2 = cv2.Sobel(img, -1, 1, 0, ksize=3)
cv2.imshow('image', img)
cv2.imshow('img_sobel', img_sobel)
cv2.imshow('img_sobel_2', img_sobel_2)
cv2.waitKey(0)
二,梯度处理Laplacian算子函数
功能:
用于计算图像的拉普拉斯算子(Laplacian)
参数:
cv2.Laplacian(src, ddepth, ksize=1, scale=1, delta=0, borderType=None)
cv2.Laplacian(输入图像 , 应该是灰度化后的图像
输出图像的所需深度,
算子的大小,它必须是 1、3、5 或 7 之一
)
返回值:
处理后的图像
应用:
import cv2
# 读取一张图
img = cv2.imread("./shudu.png")
# 使用拉普拉斯算子
img_lap = cv2.Laplacian(img, -1, ksize=3)
cv2.imshow('image', img)
cv2.imshow('img_lap', img_lap)
cv2.waitKey(0)
三,Canny算子函数
功能:
用于边缘检测的函数
参数:
cv2.Canny(image, threshold1, threshold2, edges, apertureSize, L2gradient)
cv2.Canny(输入图像,它应该是一个灰度图像
第一个阈值 , 用于确定边缘的初始点
第二个阈值, 用于确定边缘的最终点
)
返回值:
处理后的图片
应用:
import cv2
img = cv2.imread("./6.png")
# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
_, img_binary = cv2.threshold(img_gray, 127, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 进行高斯滤波
img_blur = cv2.GaussianBlur(img_binary, (3,3), 3)
# 边缘检测
img_canny = cv2.Canny(img_blur, 10, 70)
cv2.imshow('img', img)
cv2.imshow('img_canny', img_canny)
cv2.waitKey(0)
四,findContours函数
功能:
来进行寻找轮廓
参数:
cv2.findContours(image, mode, method, contour, hierarchy, offset.)
cv2.findContours(输入图像,一个二值图像
查询轮廓的方式,(
cv2.RETR_EXTERNAL:只检索最外层轮廓。
cv2.RETR_LIST:检索所有轮廓,但不创建任何父子关系。
cv2.RETR_CCOMP:检索所有轮廓,并将它们组织为两层结构,其中顶层是连通域的外边界,底层是孔的内边界。
cv2.RETR_TREE:检索所有轮廓,并重建完整的层次结构。
)
保存轮廓点坐标的方式(
v2.CHAIN_APPROX_NONE:存储所有的轮廓点,不进行任何近似。
cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,只保留它们的终点。
cv2.CHAIN_APPROX_TC89_L1、cv2.CHAIN_APPROX_TC89_KCOS:应用 Teh-Chin 链式近似算法的一种变体。
)
)
返回值:
contours:轮廓是由点组成的 NumPy 数组。
hierarchy : 轮廓的层次结构信息
五,drawContours函数
功能:
用于在图像上绘制轮廓的函数
参数:
cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset)
cv2.drawContours(输入图像,
这是一个 Python 列表, cv2.findContours() 函数返回的 NumPy 数组。
轮廓列表的索引值,-1表示绘制所有轮廓
颜色
轮廓线条粗细
)
返回值:
处理后的图像
应用
import cv2
img = cv2.imread("./6.png")
# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
_, img_binary = cv2.threshold(img_gray, 127, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 寻找轮廓
contours, hierarchy = cv2.findContours(img_binary,
cv2.RETR_LIST, # 查询轮廓的方式
cv2.CHAIN_APPROX_SIMPLE # 保存轮廓点坐标的方式
)
# 绘制轮廓
img_copy = img.copy()
img_draw = cv2.drawContours(img_copy, # 要绘制轮廓的图像
contours, # 轮廓的顶点坐标集 列表
-1, # 轮廓列表的索引值,-1表示绘制所有轮廓
(0, 0, 255), # 颜色
3 # 轮廓线条粗细
)
cv2.imshow('image', img)
cv2.imshow('image_draw', img_draw)
cv2.waitKey(0)
通过修改drawContours 的索引值
如图
六,透视变换函数
功能、参数、返回值
详细请看OpenCV 图片矫正-CSDN博客
应用:通过边缘检测 得到四个点坐标
import cv2
import numpy as np
#输入数据
img = cv2.imread("./ts.png")
img_copy = img.copy()
#高斯滤波
img_blur = cv2.GaussianBlur(img,(3,3),1)
#灰度化
img_gray = cv2.cvtColor(img_blur,cv2.COLOR_BGR2GRAY)
#二值化
_,img_binary = cv2.threshold(img_gray,127,255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU
)
#寻找轮廓
contours, _ = cv2.findContours(img_binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
M = cv2.moments(cnt)
if int(M['m00'])==0:
continue
arc_len = cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,float(0.04)*arc_len,
True)#返回逼近的多边形点集
print(approx)
if len(approx)==3:
shape = 'triangle'
elif len(approx) == 4:
x,y,w,h=cv2.boundingRect(approx)
ratio = w/h
if 0.95<=ratio<=1.05:
shape ="square"
else:
shape = 'rectangle'
elif len(approx) == 5:
shape = 'pentagon'
else:
shape = 'circle'
cv2.drawContours(img_copy,[cnt],-1,(0,0,0),2)
cx = int(M['m10'] / M['m00'])
cy = int(M['m01'] / M['m00'])
cv2.putText(img_copy,#图片
shape,#添加文字字符串
(cx,cy),
cv2.FONT_HERSHEY_SIMPLEX,
0.5,
(255,255,255))
points1 = np.array([[221, 132], [670, 178], [148, 385], [655, 441]],
dtype=np.float32)
points2 = np.array([[0, 0], [img.shape[1], 0], [0, img.shape[0]], [img.shape[1], img.shape[0]]],
dtype=np.float32)
M = cv2.getPerspectiveTransform(points1, points2)
# 3、透视变换
img_warp = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))
cv2.imshow('image',img)
cv2.imshow('image_copy',img_copy)
cv2.imshow('image_warp',img_warp)
cv2.waitKey(0)
七举例轮廓的外接边界框,并对比说明
外接矩形(cv2.boundingRect()
)
计算轮廓的外接矩形,是一个轴对齐的矩形,不考虑物体的旋转。
最小外接矩形(cv2.minAreaRect()
)
计算一个最小面积的外接矩形,它不一定与坐标轴对齐,而是可以旋转以最小化矩形面积
import cv2
import numpy as np
img = cv2.imread("./outline.png")
#灰度
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值
_,img_binary = cv2.threshold(img_gray,127,255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU
)
#寻找轮廓
contours,_ = cv2.findContours(img_binary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE
)
#绘制轮廓
img_draw = img.copy()
cv2.drawContours(img_draw,contours,-1,(0,255,255),2)
#外接最小外接矩形
for i in contours:
cv2.boundingRect(i)#获取左上坐标(x,y),宽w,高h
x,y,w,h =cv2.boundingRect(i)
cv2.rectangle(img_draw,[x,y],[x+w,y+h],(0,255,0),2)
#二获取三个元素元组(中心坐标,长宽,旋转角度)
ret =cv2.minAreaRect(i)
#调用v2.boxPoints(ret)函数获取旋转矩阵的四个顶点
box =np.int32(cv2.boxPoints(ret))
#绘制轮廓
cv2.drawContours(img_draw,[box],-1,(0,0,255),3)
# #第三 调用外接圆函数
# (x,y),radius = cv2.minEnclosingCircle(i)
# (x,y,radius) = np.int32((x,y,radius))
# cv2.circle(img_draw,(x,y),radius,(255,0,255),3)
cv2.imshow("img",img)
cv2.imshow("img_draw",img_draw)
cv2.waitKey(0)