返回顶部
首页 > 资讯 > 后端开发 > Python >Python OpenCV的基本使用及相关函数
  • 460
分享到

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

2024-04-02 19:04:59 460人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1、图像的读取2、图像保存3、图像展示4、获取图像属性5、图像缩放(宽,高)6、在原图像中获取某一区域7、彩色图像通道分解8、图像加法9、图像反转10、图像金字塔11、直方图12

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使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python OpenCV的基本使用及相关函数

本文链接: https://lsjlt.com/news/117897.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python OpenCV的基本使用及相关函数
    目录1、图像的读取2、图像保存3、图像展示4、获取图像属性5、图像缩放(宽,高)6、在原图像中获取某一区域7、彩色图像通道分解8、图像加法9、图像反转10、图像金字塔11、直方图12...
    99+
    2024-04-02
  • 说GTID - 与GTID相关的4个基本函数和使用场景
    4个基本函数1. GTID_SUBSET(set1,set2) - 若在set1中的GTID,也在set2中,返回true,否则返回false(set1是set2的子集)。[root@mysql.sock]...
    99+
    2024-04-02
  • 使用opencv相关函数确定图片中的直线问题
    目录使用opencv相关函数确定图片中的直线OpenCV:直线检测使用opencv相关函数确定图片中的直线 #pip install opencv-python==4.4.0.4...
    99+
    2022-11-13
    使用opencv opencv函数 opencv图片中直线
  • Python函数使用的相关练习题分享
    目录1.写函数计算传入数字参数的和(动态传参)2.写函数用户传入修改的文件名3.写函数检查用户传入的对象4.写函数检查传入字典的每一个value的长度5.闭包6.写函数返回一个扑克牌...
    99+
    2024-04-02
  • Mysql中Json相关的函数使用
    目录一、前言二、创建jsON文本的函数2.1.JSON_ARRAY(转换json数组)2.2.JSON_OBJECT(转换json对象)2.3.JSON_QUOTE(转义字符串)三、搜索JSON文本的函数3.1.JSON...
    99+
    2023-06-09
    Mysql Json函数 Mysql Json
  • numpy相关函数如何使用
    本篇内容介绍了“numpy相关函数如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!np.where首先强调一下,wher&#...
    99+
    2023-06-27
  • Python-OpenCV中的cv2.inpaint()函数的使用
    目录概念库函数实现代码概念 修复是图像插值。数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用。 大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等。你...
    99+
    2024-04-02
  • Python中数字以及算数运算符的相关使用
    Python数字 数字数据类型用于存储数值。 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。 当你指定一个值时,Number对象就会被创建: var1 = 1 var2 = 1...
    99+
    2022-06-04
    运算符 数字 Python
  • PHP日期相关函数的介绍及用法
    这篇文章主要介绍“PHP日期相关函数的介绍及用法”,在日常操作中,相信很多人在PHP日期相关函数的介绍及用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP日期相关函数的介绍及用法”的疑惑有所帮助!接下来...
    99+
    2023-06-20
  • Python数据处理之pd.Series()函数的基本使用
    目录1.Series介绍2.Series创建1.pd.Series([list],index=[list])2.pd.Series(np.arange())3 Series基本属性4...
    99+
    2024-04-02
  • Vue3.2 setup语法糖及Hook函数基本使用
    目录引言setup(语法糖)1、基本使用2、自动注册3、组件通信defineEmit ----> [子组件向父组件事件传递] 代码示列:defineExpose ---->...
    99+
    2024-04-02
  • python中super()函数的理解与基本使用
    目录前言super的用法 super的原理 Python super()使用注意事项混用super与显式类调用 不同种类的参数 总结 前言 Python是一门面向对象的语言,定义类时...
    99+
    2024-04-02
  • Python中range函数的基本用法
    Python中range()是一个内置函数,用于生成一个整数序列,其基本语法为“range(start, stop[, step])”,其中,start表示序列的起始值(可以省略,默认为0),stop表示序列的结束值(必须指定),...
    99+
    2024-01-26
    python range函数
  • 如何解析Python中的基本函数及其常用用法
    今天就跟大家聊聊有关如何解析Python中的基本函数及其常用用法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。函数是为了达到某种目的而采取的行为,函数是可重复使用的,用来实现某个单一...
    99+
    2023-06-01
  • python-opencv-cv2.threshold()二值化函数的使用
    目录1.cv2.threshold()参数说明2.代码示例1.cv2.threshold()参数说明 cv2.threshold(src, thresh, maxval, type[...
    99+
    2022-11-13
    python-opencv python cv2.threshold() 二值化函数
  • 关于初识MySQL数据库以及MySQL的基本使用
    文章目录 什么是数据库什么是MySQL为什么要有数据库 MySQL基本使用连接mysql查看当前服务器对应的数据库创建数据库进入某个数据库建立一张表向表中插入数据查询表中的数据 服务器,数据库,表之间的关系数据逻辑存储MyS...
    99+
    2023-08-16
    数据库 mysql sql
  • python六种基本数据类型及常用函数展示
    目录number(数字)Number类型常用的函数随机数importrandomstring(字符串)字符串常用的函数list(列表)列表的常用函数set(集合)tuple(元组)d...
    99+
    2024-04-02
  • PHP函数的基本使用方法
    在现代的网页应用程序中,PHP作为一种重要的服务器端编程语言,被广泛应用。PHP中的函数是一种可重用的代码块,不仅简化了代码的编写,而且提高了代码的可维护性和可读性。本文将介绍PHP函数的基本使用方法,以帮助读者更好地理解和应用PHP函数。...
    99+
    2023-05-22
    方法 PHP函数 基本使用
  • VB.NET计算数字相关函数的使用方法
    这篇文章将为大家详细讲解有关VB.NET计算数字相关函数的使用方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。VB.NET编程语言一经出现,就凭借其强大的功能受到广大开发人员的青睐。它的应...
    99+
    2023-06-17
  • js日历相关函数使用详解
    本文实例为大家分享了js日历相关函数的具体代码,供大家参考,具体内容如下 1、获取某年某月第一天是周几 getMonthStartDay(year, month, index) { ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作