opencv-python常见方法使用教程(一)

2023-10-27


一、OpenCV是什么?

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

二、使用步骤

本文基于python版本opencv使用讲解,本教程环境如下:

  • Windows10操作系统
  • Anaconda虚拟环境
  • python版本3.6
  • opencv-python版本4.4
  • matplotlib版本3.2.2
  • 代码工具Pycharm

1.安装

直接在当前python环境中执行命令pip install opencv-python安装即可,默认会安装最高版本
如果需要指定版本号,则使用pip install opencv-python==4.4

python代码中引入opencv:

import cv2 as cv

2.读取图片

方式一

直接使用opencv读取,读取后会弹框将图片显示

代码如下(示例):

import cv2 as cv

src = cv.imread('image.jpg')
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果
在这里插入图片描述

方式二

配合matplotlib将图片展示出来

import cv2
import matplotlib.pyplot as plt

#注意在某些系统下或者某些环境下,图片路径包含中文会报错
image = cv2.imread('image.jpg')
plt.imshow(image)
#不显示坐标轴
plt.axis('off')
plt.show()

运行结果
在这里插入图片描述
我们能看到结果跟原图颜色不一致,原因是:
cv2读取图片,是读取BGR形式;而matplotlib显示是以RGB,所以出现色彩和原图不同
我们可以加上这段代码,将颜色转换一下,显示颜色就正常了!

image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)

运行结果
在这里插入图片描述

3、保存图片

保存图片,如果保存转换过RGB的的图片,那就会跟原图不一样;
虽然读取显示通道有问题,不过直接不做处理另存还是原图

cv2.imwrite("new_image.jpg",image)

运行结果
会返回True/False标识成功或者失败


4、图像的基本操作

像素操作

普通彩色图片分RGB 3个通道,所以每个像素点是三通道像素点,直接赋值可改变像素点

#获取图片高度,宽度,颜色通道数
(h,w,c) = image.shape
print(image.shape)

#获取第一个像素点
(b,g,c) = image[0,0]
print(image[0,0])

#修改第一个像素点颜色为红色
image[0,0] = (0,0,255)
(b,g,c) = image[0,0]
print(image[0,0])

运行结果
(1024, 768, 3)
[201 211 221]
[ 0 0 255]

#尝试把左上角都填充同个颜色
image[0:cY,0:cX] = (0,0,255)
show(image)

运行结果
在这里插入图片描述

图像切割

def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()
    
#获取中间点,//代表除取整
cX,cY = (w//2,h//2)
print(cX,cY)

#这边取四分之一的左上角
tl = image[0:cY,0:cX]
#右上角
tr = image[0:cY,cX:w]
#左下角
bl = image[cY:h,0:cX]
#右下角
br = image[cY:h,cX:w]

show(tl)
show(tr)
show(bl)
show(br)

运行结果
在这里插入图片描述

图像平移

使用cv2.warpAffine + numpy矩阵可实现图像平移

#往右平移250个像素点,往下平移500个像素点
M = np.float32([[1,0,250],[0,1,500]])
shifted = cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
show(shifted)

#往左平移250个像素点,往上平移500个像素点
M = np.float32([[1,0,-250],[0,1,-500]])
shifted = cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
show(shifted)

运行结果
在这里插入图片描述

图像旋转缩放

使用cv2.getRotationMatrix2D + cv2.warpAffine
实际上cv2.getRotationMatrix2D 也就是根据你要的效果帮你生成一个numpy矩阵

# 获得图片中心点
(h,w) = image.shape[:2]
(cX,cY) = (w/2,h/2)

# (cX,cY) 旋转中心点
# 45 逆时针旋转45度,顺时针的话 -45即可
# 1.0 缩放参数
M = cv2.getRotationMatrix2D((cX,cY),45,1.0)
image = cv2.warpAffine(image,M,(w,h))
show(image)

#根据中心点逆时针旋转45度
M = cv2.getRotationMatrix2D((cX,cY),-45,1.0)
image = cv2.warpAffine(image,M,(w,h))
show(image)

#根据中心点逆时针旋转45度,并且放大一倍
M = cv2.getRotationMatrix2D((cX,cY),-45,2.0)
image = cv2.warpAffine(image,M,(w,h))
show(image)

#根据中心点(cX-100,cY-100)逆时针旋转45度,并且缩小一倍
M = cv2.getRotationMatrix2D((cX-100,cY-100),-45,0.5)
image = cv2.warpAffine(image,M,(w,h))
show(image)

注意以上代码省略了重新加载图片的代码,需要得到正确效果不可一次性执行
运行结果
在这里插入图片描述

图片大小调整

通过resize方法传入宽高可以对图片大小进行调整

#固定像素指定图片大小
width = 150
height = 150
image = cv2.resize(image,(width,height))
show(image)
print(image.shape)

#等比例的调整大小
image = imread('image.jpg')
width = 80
high = int(image.shape[0]*width/image.shape[1])
image = cv2.resize(image,(width,high))
show(image)
print(image.shape)

运行结果
在这里插入图片描述

并且还提供有多种图片resize算法

interpolation - 插值方法。共有5种:

1)INTER_NEAREST - 最近邻插值法

2)INTER_LINEAR - 双线性插值法(默认)

3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。

4)INTER_CUBIC - 基于4x4像素邻域的3次插值法

5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

# cv2有5种图片resize算法
image = imread('image.jpg')
width = 150
height = 150
#最邻近
image = cv2.resize(image,(width,height),interpolation=cv2.INTER_NEAREST)
show(image)

在这里插入图片描述


总结

本篇文章先说明一些基础用法,之后会再更新更多用法。有错误请多多指正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv-python常见方法使用教程(一) 的相关文章

  • Python setuptools:如何在 setup.py 中添加私有存储库 (gitlab)?

    我上传了 2 个包 它们位于我的 gitlab 存储库中 如果我想使用 pip 将它们安装在我的系统中 这很容易 因为 gitlab 可以帮助您 https docs gitlab com ee user packages pypi rep
  • 切片稀疏(scipy)矩阵

    我将不胜感激任何帮助 以理解从 scipy sparse 包中切片 lil matrix A 时的以下行为 实际上 我想根据行和列的任意索引列表提取子矩阵 当我使用这两行代码时 x1 A list 1 x2 x1 list 2 一切都很好
  • 从Python中的字符串中提取货币金额

    我正在制作一个程序 从字符串中获取货币并将其转换为其他货币 例如 如果字符串是 the car cost me 13 250 我需要得到 and 13250 我已经有了这个正则表达式 1 确实如此 但是该字符串很有可能有多个价格 并且全部使
  • Python 2.7 将比特币私钥转换为 WIF 私钥

    作为一名编码新手 我刚刚完成了教程 教程是这样的 https www youtube com watch v tX XokHf nI https www youtube com watch v tX XokHf nI 我想用 1 个易于阅读
  • Jupyter Notebooks 不显示进度条

    我正在尝试在 Jupyter 笔记本中显示进度条 这是一台新电脑 我通常做的事情似乎不起作用 from tqdm import tqdm notebook example iter 1 2 3 4 5 for rec in tqdm not
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • python 中的 Johansen 协整检验

    我找不到任何有关在处理统计和时间序列分析 pandas 和 statsmodel 的 Python 模块中执行 Johansen 协整检验的功能的参考 有谁知道是否有一些代码可以执行时间序列之间的协整测试 现在 这已在 Python 的 s
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • Pandas 滚动窗口 Spearman 相关性

    我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和 或 Pearson 相关性 我努力了df corr df col1 rolling P corr df col2 P为窗口尺寸 但我似乎无法定义该方法 添加meth
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • 在 Sphinx 中,有没有办法在声明参数的同时记录参数?

    我更喜欢在声明参数的同一行记录每个参数 根据需要 以便应用D R Y http en wikipedia org wiki Don t repeat yourself 如果我有这样的代码 def foo flab nickers a ser
  • Django 模型:如何使用 mixin 类来覆盖 django 模型以实现 save 等功能

    我想在每次保存模型之前验证值 所以 我必须重写保存函数 代码几乎是一样的 我想把它写在 mixin 类中 但失败了 我不知道如何写 super func 我英语不好 抱歉 class SyncableMixin object def sav
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可

随机推荐

  • 计算机网络的类别

    1 英特威 互联网 internet是同一个概念 在平时使用中有不同的说法 网络不等于internet 2 不管网络怎么分类 最后都要连接到internet 3 网络的分类 一般来说是按照网络的覆盖范围或作用范围来进行划分的 1 第一种类型
  • 【Python爬虫】requests+Beautifulsoup存入数据库

    本次记录使用requests Beautiful pymysql的方法将大学排名的数据存入本地MySQL数据库 这是一篇学习性文章 希望能够分享在学习过程中遇到的坑与学到的新技术 试图用最简单的话来阐述我所记录的Python爬虫笔记 一 爬
  • 操作系统第九讲——线程的实现方式和多线程模型

    用户级线程 1 用户级线程由应用程序通过线程库实现 所有的线程管理工作都由应用程序负责 包括线程切换 2 用户级线程中 线程切换可以在用户态下即可完成 无需操作系统干预 3 在用户看来 是有多个线程 但是在操作系统内核看来 并意识不到线程的
  • Spring Cloud Alibaba微服务第25章之Jenkins

    目录 一 前言 1 领头羊 2 特点 二 Docker安装Jenkins 1 docker search jenkins查询镜像
  • Whitted-Style 光线追踪

    Whitted Style 光线追踪 生成相机光线 定义光线 每条光线相当于一条射线 具有两个固定属性 起点o以及方向d 此外参数t表示光线的长度 本节中所学习的光线类型为摄影机光线或主光线 对图像中的每一个像素 我们需要构造一条相机射线
  • Eggjs笔记:关系型数据库表之间的关系

    关系数据库中表与表的 3 种关系 1 一对一的关系 一个人对应一个唯一的身份证号 一个人对应一个唯一的驾驶证 一篇文章对应一个文章详情 如上图 一篇文章对应一个文章详情 本来可以是一张表 拆分成2张表 文章表用于存储一些通用的字段信息 文章
  • 教妹学Java(二十一):一文带你了解面向对象编程的所有概念

    你好呀 我是沉默王二 是 Web 全栈开发进阶之路 的作者 CSDN 的博客之星 教妹学 Java 是一套非常有趣的付费专栏 除了继续保持幽默风趣的行风风格 我还力求把每一个知识点讲得透彻明白 保证你可以从中受益 成为一名优秀的 Java
  • Request 详解

    1 Request对象 在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象 2 get和post请求区别 get请求 get提交的数据会放在URL之后 以 分割URL和传输数据 参数之间以 相连 ge
  • 简单易懂的 flex 布局技巧:前面盒子左对齐,后面盒子右对齐

    前言 页面布局的灵活性和效果直接影响着用户的使用体验 而在实现页面布局时 我们通常会使用 css 的布局方式来进行设计 其中 flex 布局作为一种比较新的布局方式 其灵活性和效果备受开发者的青睐 在这里 我将为大家介绍如何使用 flex
  • matlab学习:regress函数、stepwise函数、lasso函数

    做数据量化推理的大作业 考虑了几种回归模型 由于网上的资料并不多 只能借鉴部分信息 再加上自己的尝试 算是学会了matlab中regress stepwise lasso三个函数的一些用法 分享出来 先分享下有关regress函数的内容 g
  • C++模板基础(九)

    完美转发与 lambda 表达式模板 void f int input std cout lt lt void f int input t lt lt input lt lt n void f int input std cout lt l
  • springboot注入第三方jar包的类

    原文链接 https blog csdn net qq 22855003 article details 89843640 比如我们要注入第三方jar包里的CrawlerTask1 CrawlerTask2这个两个类 因为这两个类上没有被
  • JUC并发编程设计模式

    一 保护性暂停 1 1 定义 即Guarded Suspension 用在一个线程等待另一 个线程的执行结果 要点 有一个结果需要从一个线程传递到另一 个线程 让他们关联同一一个GuardedObject 如果有结果不断从一个线程到另一个线
  • Hadoop集群搭建【web端不显示从节点问题】

    系统 CentOS7 环境 jdk8 版本 hadoop 2 7 7 结构 hadoop01 namedata nodedata hadoop02 nodedata hadoop03 nodedata 配置 hadoop 2 7 7 etc
  • 数仓模型理论

    1 数仓介绍 2 建模理论 建模的目标 性能 成本 效率 数据质量中找到平衡点 2 0 三范式 123要求逐渐严格 每一列不可分割 属性要完全依赖于主键 不可以只依赖一部分 数据重复很多 案例中主键是学生id和课程 所属系和系主任只依赖学生
  • qt的QListwiget设置横向的排列

    cpp view plain copy contentsWidget new QListWidget contentsWidget gt setViewMode QListView IconMode contentsWidget gt se
  • MyBatis映射文件与核心配置文件

    目录 1 Mapper 映射文件 2 POJO类 3 Junit测试代码 4 MyBatis 配置文件详解 5 mapper 映射配置文件详解 1 Mapper 映射文件 在 MyBatis 中 推荐使用 mapper 作为包名 我们只需要
  • LeetCode 53. Maximum Subarray 最大连续字段和问题

    考察 最大连续字段和问题 解决问题时间复杂度 O n 问题隐含条件 如果给出的数集都是负数 那么最大连续字段和就是 最大的那个负数 eg 2 1 结果应该输出 1 而不是 0 int maxSubArray int nums int num
  • vue中 $event 的用法--获取当前父元素,子元素,兄弟元素

    vue中 event 的用法 获取当前父元素 子元素 兄弟元素
  • opencv-python常见方法使用教程(一)

    文章目录 一 OpenCV是什么 二 使用步骤 1 安装 2 读取图片 方式一 方式二 3 保存图片 4 图像的基本操作 像素操作 图像切割 图像平移 图像旋转缩放 图片大小调整 总结 一 OpenCV是什么 OpenCV是一个基于BSD许