python的opencv最最基础初学

localhost中详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示_opencv imshow-CSDN博客

其实以下均为numpy

显示一张图片

import cv2 ####opencv读取的格式是BGR 
import matplotlib.pyplot as plt 
import numpy as np
%matplotlib inline
img=cv2.imread('ldz.jpg')
img

 出现一个庞大数组,这里不予显示

#图像的显示,也可以创建多个窗口
cv2.imshow('ldz',img)
#等待时间,毫秒级,0表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows() 
def cv_show(name,img):cv2.imshow(name,img) cv2.waitKey(4090)cv2.destroyAllWindows()
img.shape
结果是(2400, 3840, 3)    HWC

显示一张灰度图

img=cv2.imread('ldz.jpg',cv2.IMREAD_GRAYSCALE)
img
img.shape

结果是(2400, 3840)

 保存图片

cv2.imwrite('ldz.jpg',img)
type(img)#格式 如numpy.ndarray
img.size#像素点
img.dtype#数据类型

数据读取视频

#数据读取-视频
#cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。#如果是视频文件,直接指定好路径即可。vc = cv2.VideoCapture('test.mp4') #检查是否打开正确
if vc.isOpened():
open_ ,frame=vc.read() 
else:
open=Falsewhile 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(10)& 0xFF==27: break
#ret 是个布尔值是否读到图片,frame表示具体图片
#如果在10ms 内没有按键值,cv2.waitKey返回为-1,这个时候-1& 0xFF.如果等于27就满足了按下esc键退出
vc.release()
cv2.destroyAllWindows() 

截取部分图像数据

img=cv2.imread('cat.jpg')
cat=img[0:40,0:200]
cv_show('cat',cat)

颜色通道提取 

#调图时要加上cv2.waitKey和cv2.destroyAllWindows才能防止崩溃
b,g,r=cv2.split(img)
rr.shapeimg=cv2.merge((b,g,r)) img.shapeimg=cv2.merge((b,g,r))
img.shape
#只保留R
cur_img=img.copy() 
cur_img[:,:,0]=0 
cur_img[:,:,1]=0 
cv_show('R',cur_img) 

边界填充

填充后能使做卷积后,尺寸保持不变,而扩大通道的深度

为什么出来的图片偏蓝色。。。浅蓝色是因为默认通道  bgr plt默认的是rgb  改下bgr to rgb

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)import matplotlib. pyplot as plt
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.show0
  • BORDER_REPLICATE:夏制法,也就是复制最边缘像素.
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制 比如fedcbalabcdefghlhgfedcb
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴对称,gfedcb|abcdefgh|gfedcba
  • BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefgAE的动态拼贴
  • BORDER_CONS1ANT:常量法,常数值填充

 四个边角分别用x轴和y轴做相应的变换映射到图像坐标中去,取像素点填充

cv.imshow模式是BGR模式,而plt.imshow模式为RGB模式,因此需要转化才能正确显示

前面那个说错了,这个设置了gray参数,只显示灰度图的时候不需要转换

数值计算

img_cat=cv2.imread('cat.jpg')
img_dog=cv2.imread('dog.jpg')img_cat2=img_cat+10#这是numpy里的广播机制  对矩阵的每个值都加10
img_cat[:5,:,0]#打印前五行img_cat2[:5,:,0](img_cat+img_cat2)[:5,:,0]#多的会和255取余cv2.add(img_cat,img_cat2)[:5,:,0]

图像融合

img_cat+img_dog
#警告这些需要你去学pandas,matplotlib numpy才行 不然这里你不懂doge 啊米诺斯
img_shapeimg_dog=cv2.resize(img_dog,(500,414))
ing_dog.shape
#是resize,直接改变大小,reshape仅在改变维度,数据量不匹配就报错了
res=cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)#因为shape输出的是高和宽,而resize()需要的参数是宽和高
#反着是因为resize的读取是(列数,行数).
#cv2这个库读取到RGB是BGR,错误。BGR指的是颜色通道,shape出来时长宽和颜色通道数#cv2.imread函数读取图片,颜色通道排列是BGR,plt.imread()读取图片颜色通道是RGB,两个不一样
#发现plt颜色不对,是因为cv2.imread读取的图像保存为BGR格式,而plt.imshow()以为你输入的是RGBplt.imshow(res)

 拉缩图片

res=cv2.resize(img,(0,0),fx=3,fy=1)
plt.imshow(res)#开头记得import matplotlib.pyplot as plt

图像阈值

  •  ret, dst = cv2.threshold(src, thresh, maxval, type)
  •  src:输入图,只能输入单通道图像,通常来说为灰度图
  •  dst:输出图
  •  thresh:值
  •  maxval:当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  •  type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY;   cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC;  cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
  •  cv2.THRESH_BINARY超过值部分取maxval(最大值),否则取0
  •  cv2.THRESH_BINARY_INV THRESH_BINARY的反转
  •  cv2.THRESH_TRUNC大于值部分设为值,否则不变
  •  cv2.THRESH_TOZERO大于值部分不改变,否则设为0
  •  cv2.THRESH_TOZERO_INVTHRESH_TOZERO的反转

这是阈值分割的接口,将阈值以上或以下的像素全设置为同一个数,简单函数就能实现

ret, thresh1 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_BINARY)
ret, thresh2 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_BINARY_INV)
ret, thresh3 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_TRUNC)
ret, thresh4 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_TOZERO)
ret, thresh5 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_TOZERO_INV)titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]for i in range(6):plt.subplot(2, 3, i+1), plt. imshow(images[i], 'gray')plt.title(titles[i])plt. xticks(),plt. yticks([])
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

k8s之图形界面DashBoard【九】

文章目录 9. DashBoard9.1 部署Dashboard9.2 使用DashBoard 镇场 9. DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard&…

java小型人事管理系统

开发工具: MyEclipseJdkTomcatSQLServer数据库 运行效果视频: https://pan.baidu.com/s/1hshFjiG 定制论文,联系下面的客服人员

Mac版Jmeter安装与使用模拟分布式环境

Mac版Jmeter安装与使用&模拟分布式环境 1 安装Jmeter 1.1 安装Java环境 国内镜像地址:https://repo.huaweicloud.com/java/jdk/11.0.29/jdk-11.0.2_osx-x64_bin.dmg 下载dmg后,双击进行安装。 配置环境变量: # 1 打开环境变量配置文件…

微信小程序关闭首页广告

由于之前微信小程序默认开启了首页广告位。导致很多老人误入广告页的内容,所以想着怎么屏蔽广告。好家伙,搜索一圈,要么是用户版本的屏蔽广告,或者是以下一个模棱两可的答案,要开发者设置一下什么参数的,如…

牛客网-SQL大厂面试题-1.各个视频的平均完播率

题目:各个视频的平均完播率 DROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start_time dat…

机器学习之客户违约预测模型搭建之案例实战

1. 决策数模型搭建 1.1 数据预处理 客户违约预测模型的目的是通过已有的客户信息和违约表现来搭建合适的模型,从而预测之后的客户是否会违约。首先通过pandas库读取数据相关知识读取客户的证信数据以及其交易表现,即是否违约记录,代码如下&…

RabbitMQ高级-高级特性

1.消息可靠性传递 在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式来控制消息的投递可靠性模式 1.confirm 确认模式 确认模式是由exchange决定的 2.return 退回模式 回退模式是由routing…

uniapp 利用uni-list 和 uni-load-more 组件上拉加载列表

列表的加载动作,在移动端开发中随处可见,笔者也是经常用到。今天正好有空,做一个总结,方便以后使用。uniapp 利用uni-list 和 uni-load-more 组件上拉加载列表操作步骤如下:1、资料准备 1)、uni-load-more…

spring boot集成redis实现共享存储session

spring boot集成redis实现共享存储session redis实现共享存储session 首先下载redis,我下载的版本是5.0.14,目前官网貌似找不到5.x版本&#xff0c;可以自行去网上寻找。我这里的springboot版本是2.6.4引入redis依赖 <!-- https://mvnrepository.com/artifact/org.spring…

antd5 虚拟列表原理(rc-virtual-list)

github:https://github.com/react-component/virtual-list rc-virtual-list 版本 3.11.4(2024-02-01) 版本&#xff1a;virtual-list-3.11.4 Development npm install npm start open http://localhost:8000/List 组件接收 Props PropDescriptionTypeDefaultchildrenRender …

FFmpeg转码参数说明及视频转码示例

-b : 设置音频或者视频的转码码率 -b:v 只设置视频码率 -b:a 只设置音频码率 -ab: 只设置音频码率, 默认码率大小为: 128k bit/s -g: 设置视频GOP大小,表示I帧之间的间隔,默认为12 -ar: 设置音频采样率,默认0 -ac: 设置音频通道数量 默认0 -bf: 设置连…

读书·计算机组成与设计:软硬件接口RISC-V版·第三章

加法和减法 减法&#xff1a; 将负数用二进制补码的形式表现出来并相加 补码&#xff1a; 除了符号位&#xff0c;其他位置 取反 1 正数 &#x1f449; 负数补码&#xff1a; 全部取反 1 负数补码 &#x1f449; 正数 &#xff1a; 全部取反 1 减法就是&#xff1a; 将 相…

使用Lua编写Wireshark解析ProtoBuf插件

文章目录 Wireshark Protobuf Lua-dissectorStep 1: 获取 WiresharkStep 2: 配置ProtoBuf相关设置添加ProtoBuf查找路径 Step 3 运行和调试Lua代码1. 添加Lua脚本2. 运行和调试 Step 4: 写Lua Dissector代码 :)Step 5(Optional): Decode AsGithub工程地址 Wireshark Protobuf L…

inux(CentOS)/Windows-C++ 云备份项目(项目文件操作工具类设计,完成项目基本文件操作-读写-压缩-目录操作)

文章目录 1. 项目文件操作工具类设计 1. 项目文件操作工具类设计 根据前面的分析&#xff0c;这个文件类的基本属性如下&#xff1a; 文件大小信息文件最后修改时间文件最后一次访问时间&#xff0c;方便文件的热点管理文件名称&#xff0c;需要从http 请求行上的uri中获取基…

python问题:vscode切换环境,pip安装库网络错误

python问题&#xff1a;vscode切换环境&#xff0c;pip安装库网络错误 vscode切换环境pip安装库网络错误 记录一下遇见的python问题。 vscode切换环境 在vscode上面的搜索框输入 > select interpreter然后选择需要的环境。 pip安装库网络错误 用requirements.txt来安装…

Java 与 Go:可变数组

可变数组&#xff08;也称为动态数组&#xff09;是一种可以在运行时动态增加或减少其大小的数据结构。由于其动态分配大小&#xff0c;灵活性增删改查&#xff0c;动态地管理内存&#xff08;在需要时动态分配内存空间&#xff0c;以适应数据结构的大小变化&#xff0c;而不会…

单片机FLASH深度解析和编程实践(下)

本篇文章将同大家分享单片机FLASH编程的相关寄存器和寄存器操作及库函数操作。本篇文章依然以STM32单片机为例进行解析。有关FLASH的基本原理和实现方法&#xff0c;大家可以参考上一篇文章&#xff1a;单片机FLASH深度解析和编程实践&#xff08;上&#xff09;-CSDN博客 目录…

物联网 3.15日 | 2024年中国七大 IoT 物联网云平台价格对比

随着 中国电信天翼 CTWing 物联网平台正式开始收费&#xff0c;国内物联网平台云产品发展进入成熟期&#xff0c;越来越多企业选择云厂商提供的物联网PaaS服务&#xff0c;以降低运营成本&#xff0c;缩短业务上线周期&#xff0c;释放运维的人力&#xff0c;按需付费动态扩容。…

【STM32定时器 TIM小总结】

STM32 TIM详解 TIM介绍定时器类型基本定时器通用定时器高级定时器常用名词时序图预分频时序计数器时序图 定时器中断配置图定时器定时 代码调试 TIM介绍 定时器&#xff08;Timer&#xff09;是微控制器中的一个重要模块&#xff0c;用于生成定时和延时信号&#xff0c;以及处…

宝塔 安装对外服务Tomcat和JDK

一、安装Tomcat\JDK 切记1&#xff1a;如果选择下载节点失败&#xff0c;请到软件商城安装 。 切记2&#xff1a;提醒安装Nginx或Apache &#xff0c;先点安装&#xff0c;进入再打叉关闭。因为Tomcat服务足够为我们搭建JavaWeb网站服务了。 切记3&#xff1a;Nginx占用80端口…