opencv常用函数和常用操作

一.安装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)

在这里插入图片描述

  • 34
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selenium399

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值