Opencv基本操作

Opencv基本操作

导入并使用opencv进行图像与视频的基本处理 opencv读取的格式是BGR

import cv2 #opencv读取的格式是BGR
import numpy
import matplotlib.pyplot as plt
%matplotlib  inline

在这里插入图片描述

图像读取

通过cv2.imread()来加载指定位置的图像信息。

img = cv2.imread('./res/car.png')
img

从而得到三通道位置的彩色图像

在这里插入图片描述

读入图像的shape img.shape来进行查看

其中:cv2.IMREAD_COLOR:彩色图像 cv2.IMREAD_GRAYSCALE:灰度图像

图像的读取,彩色图像与灰度图像的转换

#图像的显示,也可以创建多个窗口
cv2.imshow('image',img) 
# 等待时间,毫秒级,0表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows()

将代码块定义为函数的形式方便之后图片文件的读取:

# name:图片名称  img 图片路径
def showimg(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
showimg('image',img)

从而将图片在窗口中进行读取操作

在这里插入图片描述

将彩色的图像转换为灰度图像并进行读取

img=cv2.imread('./res/car.png',cv2.IMREAD_GRAYSCALE)
img
showimg('car',img)

在这里插入图片描述

img.shape
img.size
type(img)

图像的保存操作

保存
cv2.imwrite(‘./mycar.png’,img)

视频操作

对于视频的处理我们可以理解为多个动态图像的处理,对于视频的每一帧我们当作是一个图像来进行处理。

cv2.VideoCapture:可以捕获摄像头,用数字来控制不同的设备,例如0,1。
如果是视频文件,直接指定好路径即可。

首先读取一帧的彩色图片通过.read()来读取下一帧的图像。通过循环操作即可以达到视频读取的效果。、

vc = cv2.VideoCapture('./res/test.mp4')
# 检查是否打开正确
if vc.isOpened(): oepn, frame = vc.read()
else:open = False
showimg("frame",frame)

在这里插入图片描述
视频转换为灰度视频并进行读取操作。

while open:ret, frame = vc.read()if frame is None:breakif ret == True:gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)cv2.imshow('result', gray)if cv2.waitKey(100) & 0xFF == 27: #27代表的是退出键break
vc.release()
cv2.destroyAllWindows()

类比之下可以写出读取彩色的图像并进行动态的显示

while oepn:result,frame = vc.read()if frame is None:breakif result == True:cv2.imshow('video',frame)if cv2.waitKey(50) & 0xFF == 27: #27代表的是退出键break
vc.release()
cv2.destroyAllWindows()

图像简单处理

对于图像的基本处理包括了

  • 截取部分图像数据
  • 颜色通道提取
  • 图像的填充

这几个图像的基本操作,可以类比于pytorch的图像增强的相关的操作

截取部分图像数据

对于之前的car图片确定其大小为550 x 949的三通道彩色图片。

将其裁剪(50,100)边沿区域裁剪,也可以在指定的位置来进行裁剪操作

car=img[100:200,300:400] 
showimg('car',car)

在这里插入图片描述

颜色通道提取

通过 b,g,r=cv2.split(img) 对彩色图片的三个颜色通道来进行提取操作。

b,g,r=cv2.split(img)
# 只保留B
cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('B',cur_img)# 只保留R
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)# 只保留G
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('G',cur_img)

即可以得到单通道的彩色图片。
在这里插入图片描述

边界填充

  • BORDER_REPLICATE:复制法,也就是复制最边缘像素。
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
  • BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
  • BORDER_CONSTANT:常量法,常数值填充。
top_size,bottom_size,left_size,right_size = (50,50,50,50)replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')plt.show()

在这里插入图片描述

数值计算与图像融合

opencv中图像的格式使用的是numpy的结构(非tensor结构)实际上和numpy一样可以继续数值上的运算

读取另外的一张图片来进行测试。

img_cat = cv2.imread('./res/cat.jpg')
#%%
img
#%%
img.shape
#%%
img+10 # 每个元素之间来进行计算

两个图片在大小格式相同的情况下进行数值相加的计算时,超过255的部分需要执行%256的操作步骤。

#相当于% 256
(img_cat + img_cat)[:5,:,0] 
# 超过的部分之间按照255来进行计算
cv2.add(img_cat,img_cat)[:5,:,0]

在这里插入图片描述
图像融合:首先进行裁剪保证图片的尺寸相同,之后调用相应的方法进行图像融合的操作。

若之间相加进行融合则会报错。(尺寸不同)

ValueError Traceback (most recent call last)
Cell In[34], line 1
----> 1 img_cat + img_dog
ValueError: operands could not be broadcast together with shapes (414,500,3) (429,499,3)

将两张图片的大小改为相同,在执行融合的操作

img_cat.shapeimg_dog = cv2.resize(img_dog, (500, 414))
img_dog.shape

设置对应的权重值进行融合操作

res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)
showimg("res",res)
#%%
plt.imshow(res)

从而得到相应的图片融合效果

在这里插入图片描述
在这里插入图片描述

从而完成了图像融合的相关操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3-哈希表-51-四数相加 II-LeetCode454

3-哈希表-51-四数相加 II-LeetCode454 LeetCode: 题目序号454 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术文&#xff…

定时TH1、计数TL1 的计算

定时器模式 通常在模式 1 下,定时器 1 是 16 位定时器(2的16次方65536)(8位256)。定时器的计时周期是由 TH1 和 TL1 的组合值决定的。初始值为 65536 − ( T H 1 256 T L 1 ) 65536 - (TH1 \times 256 TL1) 65536…

Spring boot注解学习

1、SpringBootApplication spring boot 核心注解,加在Spring boot 主类之上,是Configuration、EnableAutoConfiguration、ComponentScan 注解的集合。  (1)Configuration:允许以Bean注解将对象托管给spring容器&#…

基本表的定义:创建表、修改表、删除表

一、创建数据库与打开数据库 学生选课数据库 学生(学号,姓名,性别,出生时间,所在系) 课程(课程编号,课程名,先修课程号) 选课(学号&#xff0…

Java File IO

Java File IO ~主要介绍四个类 InputStream OutputStream FileReader FileWriter~ InputStream (字节流读取File) public static void main(String[] args) throws IOException {String filePath "D:\\Javaideaporject\\JavaBaseSolid8\\File\\t…

js调试过程中修改变量值

1.在想要变更的地方添加断点 2.添加监视表达式 3.执行网页代码,当执行到断点处则会停止 4.点击执行下一步,则会执行监视表达式

19、关于加强行政事业单位数据资产管理的通知

党中央有关部门,国务院各部委、各直属机构,全国人大常委会办公厅,全国政协办公厅,最高人民法院,最高人民检察院,各民主党派中央,有关人民团体,各省、自治区、直辖市、计划单列市财政厅(局),新疆生产建设兵团财政局,有关中央管理企业: 为贯彻落实《中共中央 国务…

Linux下打印封装_统计函数执行时间_线程号时间戳打印

统计函数执行时间(多线程环境下统计结果不准) // 无返回值 #define FUNC_EXEC_TIME_NORET(fun,promote) ({ \ unsigned long long timeDelta 0; \ struct timespec t1 {0}; \ struct timespec t2 {0}; \ clock_gettime(CLOCK_MONOTONIC, &t1); \ …

web3规则改变者:Linea的厉害之处

Linea 的厉害之处 想象一下,Linea 就像是一条神奇的高速公路,它让开车(在这里指的是交易)变得更快、更便宜,而且还很舒服。Linea 是由一个叫 Consensys 的大公司建造的,它用了一些超级酷的技术&#xff0c…

托盘图标结构体TBBUTTON和TRAYDATA相关说明文章记录

1、托盘图标管理器与跨进程SendMessage :http://www.qingfengju.com/article.asp?id294 2、TrayData 结构详解:http://llll123cccc.blog.163.com/blog/static/316586420105864647151/ 3、Shell Tray Info - Arrange your system tray icons&#xff1…

高考分数查询结果自动推送至微信(卷II)

祝各位端午节安康!只要心中无结,每天都是节,开心最重要! 在上一篇文章高考分数查询结果自动推送至微信(卷Ⅰ)-CSDN博客中谈了思路,今天具体实现。文中将敏感信息已做处理,读者根据自…

从零开始精通Onvif之获取设备信息

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。 与设备交互的第一步 发现设备之后,与设备进行交互的第一步,是连接上设备,并获取设备的信息。连接设备&#…

FiRa标准之认证流程

在实现FiRa MAC时需要考虑其兼容性,同时对外部而言,如何证明一个UWB设备是否满足FiRa的规范要求,就需要通过一定的组织对相应的设备进行检测、认证。 为此,FiRa联盟已经建立了国际认证程序,制定了验证待检设备&#x…

React+TS前台项目实战(四)-- layout整体布局搭建

文章目录 前言一、Layout组件代码注释说明二、Content全局组件注释说明三、Header基础布局组件1. Header父级组件注释说明2. NavMenu导航子组件详细说明 四、效果展示总结 前言 本文主要讲Layout整体布局的构建以及全局内容盒子Content组件的使用。还包括了导航栏组件的基本封…

【QT】QT6.3新特性,以及使用技巧

Qt 6.3作为Qt框架的一个重要更新,引入了许多新特性和改进,以提高开发效率和应用程序性能。以下是一些使用Qt 6.3的技巧和最佳实践: 利用新模块和特性: 了解并利用Qt 6.3中新增的模块和特性,例如Qt Quick 3D、Qt PDF等&…

未来几年,同样的性能,推理功耗降低为现在的几万分之一,有可能吗

未来几年,同样的性能,推理功耗降低为现在的几万分之一,有可能吗 一.数据二.抓取LLM排行榜,相同的MMLU精度,模型参数量缩减倍数三.其它 有人说未来几年,推理功耗能降低为现在的几万分之一,好奇怎么能做到呢 一.数据 二.抓取LLM排行榜,相同的MMLU精度,模型参数量缩减倍数 import…

spool 管道 小文件 mknod

Spool File In SQL*PLUS in Multiple Small Files ? (Doc ID 2152654.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 12.1.0.2 [Release 10.2 to 12.1] Oracle Database Cloud Schema Service…

从零开始搭建Electron项目之运行例程

最好的学习方式就是:给一段能够运行的代码示例。 本文给出了例程资源,以及运行的步骤。 在国内开发electron有一点特别不好,就是如果不爬梯子,下载依赖容易出错。 一、例程资源 到如下路径下载例程到本地。 GitCode - 全球开发者…

32、matlab:基于模板匹配的车牌识别

1、准备工作 1)准备材料 车牌字符模板和测试的实验车牌 2)车牌字符模板 数字、字母和省份缩写 3)测试车牌 四张测试车牌 2、车牌识别实现(已将其嵌入matlab) 1)打开APP 找到APP 找到我的APP双击点开 2)界面介绍 包括&am…

C语言考试内容

C语言考试通常会涵盖以下几个主要方面: 1. **基本概念**: - C语言的历史和特点 - C语言的编译过程 - 程序的基本结构(包括预处理指令、主函数main()、函数定义等) 2. **数据类型和运算符**: - 基本数据类…