一.安装opencv
- python 3.6.3
- pip install opencv-python==3.4.1.15
- pip install opencv-contrib-python==3.4.1.15
如果觉得下载网速慢的可以换源.在C:\Users\${XXX用户}\pip
下新建pip.ini
,输入下面内容替换成清华源。
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
二.常用函数
- cv2.imread(filepath,flags) 读取图片,默认是三通道(BGR)的彩色图,flags=0读入灰度图
- cv2.VideoCapture 读取视频
- cv2.imshow(name,img) 显示图片,需与cv2.waitkey(0)一起使用,不然只显示一瞬间
- cv2.waitkey(timeout) 显示图片时间,单位为ms,0代表一直显示
- b,g,r=cv2.split(img) 颜色通道提取,opencv提取格式为BGR(注意不是RBG)
- cv2.merge(b,g,r) 重新组合颜色通道
- cv2.imwrite(filename,img) 保存图像
- cv2.copyMakeBorder(img,top, bottom, left, right,borderType) 填充边界
- cv2.resize(img, (width, height)) 变换图像大小(注意img.shape的出来的是(height,width))
- cv2.addWeighted(img1,α,img2,β,b) 为图片添加权重, 混合图像
αX1+βX2+b
- cv2.blur(img,ksize) 均值滤波(
矩形中间的值=矩形内的值相加取平均值
) - cv2.boxFilter(img, ddepth,ksize, normalize=True) 方框滤波: (
normalize=True等同于均值滤波, normalize=false代表直接求和不取均值,越界后显示为255
) - cv2.GaussianBlur(img, ksize, sigmaX) 高斯滤波:(
离得近的权重高,离得远的权重低
) - cv2.medianBlur(img,ksize) 中值滤波:(
矩形内的值排序后取中间值
) - cv2.erode(img, kernel, iterations) 腐蚀操作
- cv2.dilate(img1, kernel, iterations) 膨胀操作
- cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) 开运算(
先腐蚀再膨胀
) - cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) 闭运算(
先膨胀再腐蚀
) - cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) 梯度运算(
膨胀-腐蚀
) - cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) 顶帽运算(
原始值-开运算
) - cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) 底帽运算(
闭运算-原始值
) - cv2.Sobel(img, ddepth, dx, dy,ksize) Sobel算子
- cv2.Scharr(img, ddepth, dx, dy) Scharr算子(
能捕捉到更多的细节
) - cv2.Laplacian(img, ddepth) Laplacian算子(
噪点影响很大
) - cv2.Canny(img, threshold1, threshold2) 边缘检测(
threshold<value<threshold2,范围越大,边缘检测细节越多
- cv2.pyrUp(img) 高斯金字塔:向上采样(
放大图像
) - cv2.pyrDown(img) 高斯金字塔:向下采样(
缩小图像
) - img-cv2.pyrUp(cv2.pyrDown(img)) 拉普拉斯金字塔(
原图-(先缩小后放大)
) - cv2.findContours(img, mode, method) 找出轮廓
- drawContours(img, contours, contourIdx, color) 画出轮廓
- cv2.contourArea(contour) 轮廓面积
- cv2.arcLength(cnt, True) 轮廓周长 True表示闭合的
- cv2.approxPolyDP(cnt, epsilon, True) 轮廓近似(
普朗克算法
) - cv2.matchTemplate(img, templ, method) 模板匹配
- cv2.rectangle(img, pt1, pt2, color) 画矩形
- cv2.calcHist(img, channels, mask, histSize, ranges) 像素直方图统计
- cv2.equalizeHist(img) 直方图均衡化
三.常用操作
- 只保留某一通道
#只保留R通道为例
img[:,:,0]=0 #将B通道全部置为0
img[:,:,1]=0 #将R通道全部置为0
- 裁剪图片
img[0:200,0:200]
- 边界填充
p_top,p_bottom,p_left,p_right=(50,50,50,50)
wrap=cv2.copyMakeBorder(img,p_top,p_bottom,p_left,p_right,cv2.BORDER_WRAP)
- 混合图像
img = cv2.imread('1.png')
img1 = cv2.imread('2.png')
#!!!注意shape得出来的是(height,width),resize传入的是(width,height)
h, w = img1.shape[:2]
#将img的宽高转为img1的宽高
img = cv2.resize(img, (w, h))
#αX1+βX2+b
img2 = cv2.addWeighted(img1, 0.4, img, 0.6, 0)
- 读取视频
#读取视频
from cv2 import cv2
vc=cv2.VideoCapture('1.mp4')
#检查是否正确打开
if vc.isOpened:
open,frame=vc.read()
else:
open=False
while open:
ret,frame=vc.read()
if frame is None:
break
if ret==True:
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('1.mp4',gray)
#按esc退出视频
if cv2.waitKey(1000) & 0xFF ==27:
break
vc.release()
cv2.destoryAllWindows()
- 滤波:减少噪点
# 均值滤波
# 矩形中间的值=矩形内的值相加取平均值
blur = cv2.blur(img, (3, 3))
# 方框滤波
# normalize=True等同于均值滤波,normalize=false代表直接求和不取均值,越界后显示为255
# box = cv2.boxFilter(img, -1, (3, 3), normalize=True)
# 高斯滤波
# 离得近的权重高,离得远的权重低
gaussian = cv2.GaussianBlur(img, (3, 3), 1)
# 中值滤波
# 取矩形内的中间值
median = cv2.medianBlur(img, 3)
左起:原图–>均值滤波–>高斯滤波–>中值滤波
- 腐蚀
kernel = np.ones((3, 3), np.uint8)
# 腐蚀操作
img= cv2.erode(img, kernel, iterations=1)
- 膨胀
kernel = np.ones((3, 3), np.uint8)
img = cv2.dilate(img, kernel, 1)
- 梯度处理
# Sobel算子
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
# Scharr算子
# 能捕捉到更丰富的细节
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharrx = cv2.convertScaleAbs(sobelx)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharry = cv2.convertScaleAbs(sobely)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
#Laplacian算子
#噪点影响很大
laplacian=cv2.Laplacian(img,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
左起:原图–>Sobel算子->Scharr算子–>Laplacian算子
- 边缘检测
img = cv2.imread('1.png', cv2.IMREAD_GRAYSCALE)
img1 = cv2.Canny(img, 80, 150)
#阈值越大,边缘检测的细节越多
img2 = cv2.Canny(img, 20, 200)
- 图像金字塔
# 高斯金字塔:向上采样(放大图像)
img1 = cv2.pyrUp(img)
# 高斯金字塔:向下采样(缩小图像)
img2 = cv2.pyrDown(img)
#拉普拉斯金字塔(原图-(先缩小后放大))
img3 = cv2.pyrUp(cv2.pyrDown(img))
img.resize(img3.shape)
img4 = img-img3
- 轮廓检测
img = cv2.imread('1.png')
# 转化为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用二值图
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 根据灰度二值图找出轮廓
binary, contours, hierarchy = cv2.findContours(
thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 画出轮廓
# 这里要将原图copy一下,不然直接就在原图上画了
img1 = img.copy()
img2 = cv2.drawContours(img1, contours, -1, (0, 0, 255), 2)
- 轮廓近似
# 轮廓近似
# 普朗克算法
epsilon = 0.1*length
approx = cv2.approxPolyDP(cnt, epsilon, True)
img3 = img.copy()
img4 = cv2.drawContours(img3, [approx], -1, (0, 0, 255), 2)
- 模板匹配
# 以灰度图方式读入
img = cv2.imread('1.jpg', cv2.COLOR_GRAY2BGR)
template = cv2.imread('1_template.png', cv2.COLOR_GRAY2BGR)
h, w = template.shape[:2]
res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
img1=img.copy()
cv2.rectangle(img1, min_loc, (min_loc[0]+w, min_loc[1]+h), 255, 2)
- 像素直方图统计
import matplotlib.pyplot as plt
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
# ravel():将多维矩阵转为一维数组
plt.hist(img.ravel(), 256)
plt.show()
- 像素直方图均衡化
#直方图均衡化
import matplotlib.pyplot as plt
equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(), 256)