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:
        break
    if 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:
        break
    if 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.shape

img_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.mfbz.cn/a/695762.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公式转换坑

在线LaTeX公式编辑器-编辑器 (latexlive.com) 这个好用 latex输入后转mathtype等 1 \mathcal{V}\{0,1,\ldots,|\mathcal{V}|-1\} 这个玩意在Word死活打不出来 使用下面的方法也不行 mathtype也不行 故换符号之 LaTeX公式与MathType公式如何快速转换-MathType中文网 如何在…

1909java内部知识管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java内部知识管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开 发环境为TOMCAT7.0,Myeclipse8.5开发&…

解决windows11开机xbox自启动

1、同时按键盘“ctrlaltdelete”键,在弹出页面中选择任务管理器; 2、点击启动应用 3、找到软件Xbox App Services,选择“已启用”点击右键,点击禁用;

Redis使用中的性能优化——搭建Redis的监测服务

大纲 环境安装配置Redis安装 安装配置redis_exporter编译运行直接运行以服务形式运行 安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动 测试参考资料 抛开场景和数据,谈论性能优化,就是纸上谈兵。这个系列我们将通过相关数据…

【Python深度学习】——信息量|熵

【Python深度学习】——信息量|熵 假设1. 信息量1.1 含义1.2 信息量的公式: 2. 熵Entropy2. 含义2.2 熵的计算公式:2.3 熵的作用 假设 例子:掷硬币 假设我们有一个公平的硬币。这个硬币有两个面:正面(H)和反面(T&…

Netty

优势 1.API使用简单,开发门槛低 2.功能强大,预置了多种编码功能,支持多种主流协议; 3.定制能力强,可以通过channelHandler对通信框架进行灵活地扩展; 4.性能高,通过与其他业界主流的NIO框架对比…

C++网络编程基础

文章目录 协议局域网通信IP 地址网络通信的本质tcp 和 udp 协议网络字节序网络主机数据转化接口 协议 协议:收到数据后,多出来的那一部分,也叫一种 “约定”,一整套的自硬件到软件,都有协议,需要有人定制&a…

对象存储OSS 客户端签名直传的安全风险和解决方法

1. 前言 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面…

探索国内大模型AIGC产品

​ 人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗…

在win11系统上安装启动Hyper-V

Hyper-V 是微软公司开发的一种虚拟化技术,它允许一台物理计算机运行多个操作系统和应用程序,从而提供更好的资源利用率和系统灵活性。 win系统的linux子系统开启、android studio的虚拟环境都需要这个东西,而在初始的win11系统上可能没有这个…

Python | Leetcode Python题解之第142题环形链表II

题目: 题解: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val x # self.next Noneclass Solution(object):def detectCycle(self, head):""":type head: ListNode:…

Redis实战篇02

1.分布式锁Redisson 简单介绍: 使用setnx可能会出现的极端问题: Redisson的简介: 简单的使用: 业务代码的改造: private void handleVoucherOrder(VoucherOrder voucherOrder) {Long userId voucherOrder.getUserI…

【数据结构与算法】使用数组实现栈:原理、步骤与应用

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​ 目录 一、引言 🎄栈(Stack)是什么? &#x1…

鸿蒙开发 之 数据持久化

1.用户首选项 用户首选项(Preference)为应用提供key-value键值型的数据处理能力,支持应对持久化轻量级数据,比如小说app的字体设置背景等 1.1案例 1.index.ets import RouterInfo from ../viewmodel/RouterInfo import IndexFo…

Redis Key过期监听配置

默认情况下在Windows系统中双击redis-server.exe用的是内置的配置文件 如果希望用这两个配置文件 redis.windows.conf:这是用于在Windows上运行Redis服务器的标准配置文件。可以使用这个文件通过命令行启动Redis服务器。redis.windows-service.conf:这是…

【全开源】房屋出租出售预约系统(FastAdmin+ThinkPHP+Uniapp)

房屋出租出售预约系统:一站式解决房产交易难题 一款基于FastAdminThinkPHPUniapp开发的房屋出租出售预约系统,支持小程序、H5、APP,包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有:新盘销售、房屋租赁、地图找…

翻译《The Old New Thing》- Why do messages posted by PostThreadMessage disappear?

Why do messages posted by PostThreadMessage disappear? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20090930-00/?p16553 Raymond Chen 2008年09月30日 为什么 PostThreadMessage 发布的信息会消失? 在显示用户界面的线…

Nginx学习笔记(十)如何配置HTTPS协议?(公网)

目录 一、简介二、SSL 证书类型介绍三、公网 SSL 证书3.1 证书管理工具3.2 下载安装 acme.sh3.3 申请并下载证书报错1:没有指定账号报错2:DNS无法解析的域名报错3:无效的响应 404 3.4 配置 Nginx3.5 证书过期刷新 四、补充4.1 同一域名的不同…

软件心学格物致知篇(7)软件开发文档写什么

软件心学格物致知篇(7)软件开发文档写什么 前言 当今约束大家生产力的有哪些因素?是编程语言?开发框架?开发IDE?还是自身迫切需要更高水平的技能? 好像上面的每一项技术都在不断发展,也在不断的为我们生…

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

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