Python OpenCV的基本使用及相关函数

目录
  • 1、图像的读取
  • 2、图像保存
  • 3、图像展示
  • 4、获取图像属性
  • 5、图像缩放(宽,高)
  • 6、在原图像中获取某一区域
  • 7、彩色图像通道分解
  • 8、图像加法
  • 9、图像反转
  • 10、图像金字塔
  • 11、直方图
  • 12、图像类型转换
  • 13、图像阈值转换 、二值化
  • 14、图像平滑处理
  • 15、图像形态学操作
  • 16、图像梯度,边缘检测
  • 17、图像轮廓标注
  • 18、读取视频文件

Python-OpenCV环境的配置看上一篇OpenCV环境的配置
本篇主要介绍一下OpenCV的基本使用和相关函数的介绍。
以下所有操作都基于这三个库:
import cv2
import numpy as np
import matplotlib.pylab as plt

原图

1、图像的读取

import cv2
img = cv2.imread('文件路径'[,cv2.IMREAD_UNCHANGED])
# 其他参数
# 以原图读取 -cv2.IMREAD_UNCHANGED-默认
# 以灰度图读取 -cv2.IMREAD_GRAYSCALE
# 以彩色图读取 -cv2.IMREAD_COLOR

2、图像保存

import cv2
cv2.imwrite('image/gray_test.jpg',img)

3、图像展示

(1)使用OpenCV自带的显示函数

import cv2
# 可以决定窗口是否可以调整大小。
# cv2.namedWindow('image', cv2.WINDOW_NORMAL) # 特殊情况
cv2.imshow('显示窗口的名字',img)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
'''
cv2.waitKey(num)函数的参数介绍
num<0 按键输入消失
num==0 或不填系数 ,一直不消失
num>0 停滞num秒
'''

(2)使用matplotlib库实现
不能直接用matplotlib去显示opencv读取的图像,因为opencv读取的图像的通道顺序是[B,G,R],而matplotlib显示图像时图像的通道顺序是[R,G,B]。
解决办法

import cv2

img = cv2.imread('文件路径')
# 第一种方法
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 第二种方法
# b, g, r = cv2.split(img)
# img = cv2.merge([r, g, b])

显示图像

import cv2
matplotlib.pyplot as plt
img = cv2.imread('文件路径')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.rcParams['font.sans-serif'] = ['FangSong']  # 支持中文标签
# (2,2,1)表示一共可显示2行2列4个图像,1表示第一个图像
plt.subplot(2,2,1), plt.title("图1") #  plt.axis('off') 关闭坐标轴
plt.imshow(img) # 还可以添加一个参数cmap='gray'
plt.subplot(2,2,2), plt.title("图2")
plt.imshow(img)
plt.subplot(2,2,3), plt.title("图3"),
plt.imshow(img)
plt.subplot(2,2,4), plt.title("图4"),
plt.imshow(img)
plt.show()

(3)拼接图像并显示

import cv2
import numpy as np

# 拼接多个图片并显示
img1 = cv2.imread("1.jpg",cv2.IMREAD_UNCHANGED)
img2 = cv2.imread("2.jpg",cv2.IMREAD_UNCHANGED)
# 需要将两图片的大小改为一致
# heigh = img1.shape[0] # 高
# width = img1.shape[1] # 宽
img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0]))
res = np.hstack((img1,img2,img2)) # 水平连接
# np.vstack((img1,img2,img2)) # 竖直连接
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

4、获取图像属性

# 获取BGR图的高、宽
heigh = img.shape[0] # 高
width = img.shape[1] # 宽
# 获取BGR图的高、宽、深度
h,w,d = img.shape
# 获得图片大小 h*w 或 h*w*d
img_size = img.size
# 获得图片数据类型
img.dtype

5、图像缩放(宽,高)

# 图片缩放->(200,100)
img2 = cv2.resize(img1, (200, 100)) # (宽,高)
# 按比例缩放->(0.5,1.2)
img2 = cv2.resize(img1, (round(cols * 0.5), round(rows * 1.2)))
# 按比例缩放,参数版
img2 = cv2.resize(img1, None, fx=1.2, fy=0)

6、在原图像中获取某一区域

# 获取区域在原图中的四个点的位置(x1,y1)(x2,y1)(x1,y2)(x2,y2)
# 图像高度不变,切割宽度,原图上开始横坐标-->原图上结束横坐标
# img_x_y = img[高:高,宽:宽]
img_x_y_1 = img[ : , x1(开始横坐标):x2(结束横坐标)]
# 图像宽度不变,切割高度,原图上开始纵坐标-->原图上结束纵坐标
img_x_y_2 = img[y1(开始纵坐标):y2(结束纵坐标), : ]
# 获取具体位置
img_x_y = img[y1(开始纵坐标):y2(结束纵坐标),x1(开始横坐标):x2(结束横坐标)]

例如:

import cv2
path = 'C:\\Users\\lenovo\\Desktop\\demo.jpg'
img = cv2.imread(path)
img_1 = img[100:600,200:500]
cv2.imshow('1',img_1)
cv2.waitKey(0)
cv2.destroyAllWindows()

7、彩色图像通道分解

# 通道分解方案1
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
# 通道分解方案2
b,g,r = cv2.split(img)
# 通道合并
rgb = cv2.merge([r,g,b])
# 只显示蓝色通道
b = cv2.split(a)[0]
g = np.zeros((rows,cols),dtype=a.dtype)
r = np.zeros((rows,cols),dtype=a.dtype)
m = cv2.merge([b,g,r])

8、图像加法

# 超过255则为0
result1 = img1 + img2
# 超过255则为255
result2 = cv2.add(img1, img2)
# 图像带权重融合,第5个参数为偏移量
result = cv2.addWeighted(img1,0.5,img2,0.5, 0)

9、图像反转

img2 = cv2.flip(img1, 0) #上下翻转
img2 = cv2.flip(img1, 1) #左右翻转
img2 = cv2.flip(img1, -1) #上下、左右翻转

10、图像金字塔

# 图片向下采样,高斯滤波 1/2 删掉偶数列
img1 = cv2.pyrDown(img)
# 图片向上采样 ,面积*2 高斯滤波*4 ,下采样为不可逆运算
img3 = cv2.pyrUp(img2)
# 计算拉普拉斯金字塔
img1 = cv2.pyrDown(img) #下采样
img2 = cv2.pyrUp(img1) #上采样
img3 = img-img2

11、直方图

##matplotlib 绘制直方图
plt.hist(img.ravel(),256)
##用opencv计算直方图列表
hist = cv2.calcHist(images= [img],channels=[0],mask=None,histSize=[256],ranges=[0,255])
##掩膜提取局部直方图
pad = np.zeros(img.shape,np.uint8)
pad[200:400,200:400]=255
hist_MASK = cv2.calcHist(images= [img],channels=[0],mask=pad,histSize=[256],ranges=[0,255])
##opencv 交、并、补、异或操作
masked_img = cv2.bitwise_and(img,mask)
##直方图均衡化原理
# 图像直方图->直方图归一化->累计直方图->*255 # x坐标映射->对原来的像素值进行新像素值编码
# 直方图均衡化调用
img1 = cv2.equalizeHist(img)
# matplotlib绘制图片前通道转换
img_rgb = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #通道不一致性
##matplotlib多图绘制在一个面板上
plt.subplot('2,2,1'),plt.imshow(img,cmap=plt.cm.gray),plt.axis('off'),plt.title('original')
plt.subplot('2,2,2'), plt.imshow(img1, cmap = plt.cm.gray), plt.axis('off')
plt.subplot('2,2,3'), plt.hist(img.ravel(),256)
plt.subplot('2,2,4'), plt.hist(img1.ravel(), 256)

12、图像类型转换

# 彩色图转灰度图
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# BGR图转RGB图(重点:opencv的通道是 蓝、绿、红跟计算机常用的红、绿、蓝通道相反)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
# 灰度图转BGR图,每个通道都是之前的灰度值
img2 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)

13、图像阈值转换 、二值化

r,b = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) #图像二值化,阈值127,r为返回阈值,b为二值图
r,b = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) #图像反二值化
r,b = cv2.threshold(img,127,255,cv2.THRESH_TOZERO) #低于threshold则为0
r,b = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) #高于threshold则为0
r,b = cv2.threshold(img,127,255,cv2.THRESH_TRUNC) #截断=>高于threshold则为threshold

14、图像平滑处理

# 均值滤波
img2 = cv2.blur(img1, (5, 5))  #sum(square)/25
# normalize=1 均值滤波,normalize=0 区域内像素求和
img1 = cv2.boxFilter(img, -1, (2, 2), normalize=1)
# 高斯滤波,第三个参数是方差,默认0计算公式: sigmaX=sigmaxY=0.3((ksize-1)*0.5-1)+0.8 (注:卷积核只能是奇数)
img1 = cv2.GaussianBlur(img, (3, 3), 0)  #距离像素中心点近的权重较大,以高斯方式往四周分布
# 中值滤波,效果非常好
img1 = cv2.medianBlur(img,3)  #获得中心点附近像素排序后的中值

15、图像形态学操作

(1)图像腐蚀,k为全为1的卷积核

k = np.ones((5,5),np.uint8)
img1 = cv2.dilate(img, k, iterations=2)

(2)图像膨胀

k = np.ones((5,5),np.uint8)
img1 = cv2.dilate(img, k, iterations=2)

(3)图像开运算 (先腐蚀后膨胀),去掉图形外侧噪点

k = np.ones((5,5),np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, k, iterations=2)

(4)图像闭运算(先膨胀后腐蚀) ,去掉图形内侧噪点

k = np.ones((5,5),np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, k, iterations=2)
# 高帽运算 (原图-开运算),获得图形外噪点
k=np.ones((5,5),np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k)
# 黑帽运算(闭运算-原图),获得图像内噪点
k = np.ones((10,10),np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k)

16、图像梯度,边缘检测

import cv2
import matplotlib.pyplot as plt
import numpy as np
# 各种算子
img = cv2.imread('C:\\Users\\lenovo\\Desktop\\demo.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.GaussianBlur(img, (5, 5), 1)  # 高斯平滑
img_median = cv2.medianBlur(img, 3)  # 中值滤波
img_gray = cv2.cvtColor(img_median, cv2.COLOR_BGR2GRAY)
# Roberts 算子
kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
kernely = np.array([[0, -1], [1, 0]], dtype=int)
x = cv2.filter2D(img_gray, cv2.CV_16S, kernelx)
y = cv2.filter2D(img_gray, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
plt.rcParams['font.sans-serif'] = ['FangSong']  # 支持中文标签
plt.subplot(2,2,1), plt.title("Roberts算子"), plt.axis('off')
plt.imshow(Roberts,cmap='gray')  # matplotlib 显示彩色图像(RGB格式)
# Prewitt 算子
kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]],dtype=int)
kernely = np.array([[-1,0,1],[-1,0,1],[-1,0,1]],dtype=int)
x = cv2.filter2D(img_gray, cv2.CV_16S, kernelx)
y = cv2.filter2D(img_gray, cv2.CV_16S, kernely)
# 转 uint8 ,图像融合
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
plt.subplot(2,2,2), plt.title("Prewitt算子"), plt.axis('off')
plt.imshow(Prewitt,cmap='gray')  # matplotlib 显示彩色图像(RGB格式)
#Sobel算子
# 梯度方向: x
sobelx = cv2.Sobel(img_gray, cv2.CV_8U, 1, 0, ksize=3)
sobely = cv2.Sobel(img_gray, cv2.CV_8U, 0, 1, ksize=3)
sobel = cv2.addWeighted(sobelx,1,sobely,1,0)
plt.subplot(2,2,3), plt.title("sobel算子"), plt.axis('off')
plt.imshow(sobel,cmap='gray')  # matplotlib 显示彩色图像(RGB格式)
#canny算子
binary = cv2.Canny(img_gray, 100, 200)
plt.subplot(2,2,4), plt.title("Canny算子"), plt.axis('off')
plt.imshow(binary,cmap='gray')  # matplotlib 显示彩色图像(RGB格式)
# matplotlib 显示彩色图像(RGB格式)
# img = cv2.imread("D:/test/26.png", 0)
# Laplacian算子
# gray_lap = cv2.Laplacian(img, cv2.CV_16S, ksize=3)
# dst = cv2.convertScaleAbs(gray_lap) # 转回uint8
plt.show()

17、图像轮廓标注

gray_img = cv2.cvtColor(img_1,cv2.COLOR_BGR2GRAY) #灰度图转化
dep,img_bin = cv2.threshold(gray_img,128,255,cv2.THRESH_BINARY) #二值图转化
image_contours,hierarchy = cv2.findContours(img_bin,mode=cv2.RETR_TREE,method = cv2.CHAIN_APPROX_SIMPLE) #获得图像轮廓
to_write = img_1.copy() #原始图像copy,否则会在原图上绘制
ret = cv2.drawContours(to_write,image_contours,-1,(0,0,255),2) #红笔绘制图像轮廓
plt.subplot(2,1,1),plt.imshow(ret,'gray')
plt.show()

18、读取视频文件

# 数据读取-视频
# cv2.VideoCapture #可以捕获摄像头,用数字来控制不同的设备,例如0,1。
# 如果是视频文件,直接指定好路径即可
vc = cv2.VideoCapture("test. mp4")
# 检查是否打开正确
if vc.isOpened():
	oepn, frame = vc.reado()
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("result", gray)
		if cv2.waitKey(10) & OxFF == 27:
			break
vc.release()
cv2.destroyAllWindows()

到此这篇关于Python-OpenCV的基本使用的文章就介绍到这了,更多相关Python OpenCV使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python OpenCV之常用滤波器使用详解

    目录 1. 滤波器 1.1 什么是滤波器 1.2 关于滤波核 1.3 素材选择 2.均值滤波器 cv2.blur() 2.1 语法简介 2.2 代码示例 3. 中值滤波器 cv2.medianBlur() 代码示例 4. 高斯滤波器 cv2.GaussianBlur() 5. 双边滤波器 cv2.bilateralFilter() 1. 滤波器 1.1 什么是滤波器 滤波器是对图像做平滑处理 的一种常用工具. 平滑处理即在尽可能地保留原图像信息的情况下,对像素值进行微调,使邻近的像素值之间,值的

  • python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)

    目录 1.高斯噪声 2.椒盐噪声 3.泊松噪声 4.speckle噪声 导读: 这篇文章主要介绍如何利用opencv来对图像添加各类噪声,原图: 1.高斯噪声 高斯噪声就是给图片添加一个服从高斯分布的噪声,可以通过调节高斯分布标准差(sigma)的大小来控制添加噪声程度,sigma越大添加的噪声越多图片损坏的越厉害 #读取图片 img = cv2.imread("demo.png") #设置高斯分布的均值和方差 mean = 0 #设置高斯分布的标准差 sigma = 25 #根据均值

  • python opencv旋转图片的使用方法

    背景 在图像处理中,有的时候会有对图片进行角度旋转的处理,尤其是在计算机视觉中对于图像扩充,旋转角度扩充图片是一种常见的处理.这种旋转图片的应用场景也比较多,比如用户上传图片是竖着的时候,不好进行处理,也需要对其进行旋转,以便后续算法处理.常见的旋转处理有两种方式,一种是转化为numpy矩阵后,对numpy矩阵进行处理,另外一种是使用opencv自带的函数进行各种变换处理,以实现旋转角度的结果. 原始图像: opencv函数 旋转中常用的函数有以下几个函数 cv2.transpose: 对图像矩

  • Python 使用Opencv实现目标检测与识别的示例代码

    在上章节讲述到图像特征检测与匹配 ,本章节是讲述目标检测与识别.后者是在前者的基础上进一步完善. 在本章中,我们使用HOG算法,HOG和SIFT.SURF同属一种类型的描述符.功能代码如下: import cv2 def is_inside(o, i): ox, oy, ow, oh = o ix, iy, iw, ih = i # 如果符合条件,返回True,否则返回False return ox > ix and oy > iy and ox + ow < ix + iw and o

  • python使用OpenCV获取高动态范围成像HDR

    目录 1 背景 1.1 什么是高动态范围(HDR)成像? 1.2 高动态范围(HDR)成像如何工作? 2 代码 2.1 运行环境配置 2.2 读取图像和曝光时间 2.3 图像对齐 2.4 恢复相机响应功能 2.5 合并图像 2.6 色调映射 2.7 工程代码 1 背景 1.1 什么是高动态范围(HDR)成像? 大多数数码相机和显示器将彩色图像捕获或显示为24位矩阵.每个颜色通道有8位,一共三个通道,因此每个通道的像素值在0到255之间.换句话说,普通相机或显示器具有有限的动态范围. 然而,我们周

  • python 使用OpenCV进行曝光融合

    目录 1 什么是曝光融合 2 曝光融合的原理 3 代码与结果 1 什么是曝光融合 曝光融合是一种将使用不同曝光设置拍摄的图像合成为一张看起来像色调映射的高动态范围(HDR)图像的图像的方法.当我们使用相机拍摄照片时,每个颜色通道只有8位来表示场景的亮度.然而,我们周围世界的亮度理论上可以从0(黑色)到几乎无限(直视太阳).因此,傻瓜相机或移动相机根据场景决定曝光设置,以便使用相机的动态范围(0-255值)来表示图像中最有趣的部分.例如,在许多相机中,使用面部检测来查找面部并设置曝光,使得面部看起

  • 巧妙使用python opencv库玩转视频帧率

    目录 需求背景 关于opencv 安装opencv opencv-python获取视频相关信息 需求背景 在很多时候我们需要抽取视频的某一帧做一些分析或修改等:比如笔者需求就是判断一个人在该视频中出现的频率,以判断他是否是这段视频的主角: 关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高

  • 基于python使用OpenCV进行物体轮廓排序

    目录 1 引言 2 栗子 2.1 读取图像 2.2 获取轮廓 2.3 轮廓排序 2.4 其他结果 3 总结 1 引言 在进行图像处理过程中,我们经常会遇到一些和物体轮廓相关的操作,比如求目标轮廓的周长面积等,我们直接使用Opencv的findContours函数可以很容易的得到每个目标的轮廓,但是可视化后, 这个次序是无序的,如下图左侧所示: 本节打算实现对物体轮廓进行排序,可以实现从上到下排序或者从左倒右排序,达到上图右侧的可视化结果. 2 栗子 2.1 读取图像 首先,我们来读取图像,并得到

  • python使用OpenCV实现多目标跟踪

    目录 1 背景介绍 2 基于MultiTracker的多目标跟踪 2.1 创建单个对象跟踪器 2.2 读取视频的第一帧 2.3 在第一帧中确定我们跟踪的对象 2.4 初始化MultiTrackerer 2.5 更新MultiTracker和显示结果 3 结果和代码 前言: 在这篇文章中,我们将介绍如何在OpenCV中使用MultiTracker类实现多目标跟踪API.在深入了解详细信息之前,请查看下面列出的关于目标跟踪的帖子,以了解在OpenCV中实现的单个目标跟踪器的基础知识.同时需要安装op

  • Python中使用Opencv开发停车位计数器功能

    目录 1. 环境安装 1.1 安装并激活虚拟环境 1.2 python包安装 2. 绘制停车位矩形框 2.1 导入停车场图片 2.2 绘制矩形框 定位停车位 2.3 鼠标添加.删除停车位 3. 停车位视频分析 3. 1 停车监控视频 3. 2 截取停车位 3. 3 图像处理 3. 4 判断停车位是否被占用 在这个项目中,我们将创建一个停车位计数器.我们会发现总共有多少辆车,以及有多少停车位是空的.关于本教程最好的一点是,我们将使用基本的图像处理技术来解决这个问题,没有使用机器学习.深度学习进行训

随机推荐