【opencv】1基础知识

1.模块

 2.应用

3.图像 

注释:鲁棒性,也称健壮性、稳健性或强壮性,是指系统在异常和危险情况下生存的关键特性。

3.1 数字图像的定义:

数字图像作为2D图像,可以使用称为像素的有限数字集进行表示。

3.2 RGB模型:

是一种加法颜色模型,其中原色混合在一起就可以用来表示广泛的颜色范围。

每个原色通常表示一个通道,其取值范围为[0,255]内的整数值。

因此,每个通道共有256个离散的取值,2^8=256,由于有三个不同的通道,使用24位来表示。

3.3 像素:

在RGB颜色模型中,将像素值表示为RGB三元组,(r,g,b)

分辨率为800*1200的图像是一个包含800列和1200行的网格,每个网格就称为一个像素。

因此其中包含96万像素。

3.4 PPI:

像素的大小取决于为该图像设置的每英寸像素数(pixels per inch,PPI)

图像的PPI一般设置在[200,400]之间。

计算PPI的公式如下:

PPI=宽度(像素)/图像宽度(英寸)

PPI=高度(像素)/图像高度(英寸)

例如:一个4*6英寸图像,图像分辨率为800*1200,则PPI是200。

3.5 图像描述:

图像可以描述为二维函数f(x,y)

其中,(x,y)是空间坐标,f(x,y)是在(x,y)处的亮度或灰度或颜色值。

当(x,y)和f(x,y)均为有限离散量时,该图像被称为数字图像。

此时:

\begin{aligned} &x \in [0,h-1] \\ &y \in [0,w-1] \\ &f(x,y)\in [0,L-1] \end{aligned}

h是图像的高度,y是图像的宽度,L=256(对于8位灰度图像)

彩色图像也可以用同样的方式表示,只不过需要三个函数来分别表示红、绿、蓝。

黑白图像可以表示为相同形式,仅需要一个函数来表示图像,且f(x,y)仅能取两个值。通常,0表示黑色,1表示白色。

3.6 图像压缩:

分为有损压缩和无损压缩,对图像进行反压缩,无损压缩得到与原图像完全等价的图像,有损压缩得到的图像与原图像并不等价。在许多有损压缩算法中,压缩级别是可以调整的。

3.7 opencv中的通道顺序:

颜色通道顺序为BGR。matplotlib采用RGB。

如何处理两个库采用的不同颜色格式:

import cv2
import matplotlib.pyplot as plt
import numpy as np

# #加载图像
img_OpenCV=cv2.imread('img.jpeg')

#分割图像
b,g,r=cv2.split(img_OpenCV)
#合并通道
img_matplotlib=cv2.merge([r,g,b])
# subplot(matplotlib) 将多个图像放在同一窗口中 subplot(m,n,p)
# m确定行数,n确定列数,p确定在网格中放置的位置
# 显示图像 matplotlib 使用imshow函数

plt.subplot(121)
plt.imshow(img_OpenCV)
plt.subplot(122)
plt.imshow(img_matplotlib)
plt.show()

cv2.imshow('bgr image',img_OpenCV)
cv2.imshow('rgb image',img_matplotlib)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.8 如何拼接图像(numpy): 

#想要构建一个包含着两个图象的拼接图象,将两张图片水平拼接起来。
#使用numpy的concatenate axis=0按行拼接 axis=1按列拼接
#提供了一个用于数组拼接的函数,该函数可以将多个数组沿一个指定的轴方向进行拼接,生成一个新的数组。
img_concatenate=np.concatenate((img_OpenCV,img_matplotlib),axis=1)
cv2.imshow('BGR image and RBG image',img_concatenate)
cv2.waitKey(0)
cv2.destroyAllWindows()

 3.9 numpy的切片:

#cv2.split()比较耗时。如果确实需要划分不同通道,可以考虑使用numpy索引
#numpy切片
# b = a[i:j] 表示复制a[i]到a[j-1],以生成新的list对象
# i缺省时默认为0,即 a[:n] 代表列表中的第一项到第n项,相当于 a[0:n]
# j缺省时默认为len(alist),即a[m:] 代表列表中的第m+1项到最后一项,相当于a[m:5]
# 当i,j都缺省时,a[:]就相当于完整复制a
#b = a[i:j:s]
# 这里的s表示步进,缺省为1.(-1时即翻转读取)
# 所以a[i:j:1]相当于a[i:j]
B=img_OpenCV[:,:,0]
G=img_OpenCV[:,:,1]
R=img_OpenCV[:,:,2]
#一条语句进行转换
img_mpl=img_OpenCV[:,:,:,-1]

3.10 图像的属性:

通过cv2.imread()函数读取图像。

3.10.1 shape:

img_OpenCV=cv2.imread('img.jpeg')
print(img_OpenCV.shape)

行、列、通道的数量(如果图像是彩色的)

3.10.2 size:

img_OpenCV=cv2.imread('img.jpeg')
print(img_OpenCV.size)

图像的大小(图像高度*图像宽度*图像通道数)

3.10.3 图像数据类型:

img_OpenCV=cv2.imread('img.jpeg')
print(img_OpenCV.dtype)

像素值在[0,255]范围内,图像数据类型是uint8 unsigned char

3.11 显示图像:

cv2.imshow()

窗口会自动适应图片的大小。

第一个参数为窗口名,第二个参数为要显示的图像。

3.12 键盘绑定函数waitKey()

它为任何键盘事件等待指定的毫秒数,参数是以毫秒为单位的时间。

当执行到此函数时,程序将暂停执行,当按下任何键后,程序将继续执行。

毫秒数为0时,它将无期限的等待键盘敲击事件。

3.13 访问某个像素值:

获得(x=10,y=20)处的像素值

(b,g,r)=img[10,20]

处理某个区域的像素值

area=img[0:50,0:50]

3.14 关闭并释放所有的窗口:

cv2.destroyAllWindows()

3.15 灰度图像访问和操作:

灰度图像只有一个通道。

3.15.1 加载灰度图像:

gray_img=cv2.imread('img.jpeg',cv2.IMREAD_GRAYSCALE)
cv2.IMREAD_GRAYSCALE

是一个标志位,指定读取图像的方式。

3.15.2 灰度图像的属性:

1)shape

只能得到行和列

2)像素强度

i=gray_img[6,40]

4.总结:

 

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

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

相关文章

AI学习集合-前瞻

AI学习前瞻 工作岗位 算法工程师机器学习工程师图像算法工程师ai工程师NLP高级算法工程师 学习路线 应用场景 计算机视觉技术应用场景 自然语言应用 AI流程 AI拟人流程 机器人历史数据经验模型规律依据模型预测未来依据规律做出判断 AI基本流程 术语所用到的技术手段数据数…

第五节 JDBC驱动程序类型

JDBC驱动程序是什么? JDBC驱动程序在JDBC API中实现定义的接口,用于与数据库服务器进行交互。 例如,使用JDBC驱动程序,可以通过发送SQL或数据库命令,然后使用Java接收结果来打开数据库连接并与数据库进行交互。 JDK…

最强模型Claude 3 Haiku速通指南在此!保姆级教学拿脚都能学会!

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

3月每日一题笔记

感谢我的好朋友的鼓励 3月4日 两种等价方式?都是错误的 ->加减中不能使用等价无穷小? ->不全面。 两项无穷小相减, 那么两项无穷小比值的极限不等于 1 时, 或者两项无穷小相加时, 其比值极限不等于 −1 时, 代数和差各项可以用等价无穷小替换 等价无穷小不精确

SSD LDPC纠错算法的重要性

固态硬盘(Solid State Drives, SSD)作为计算机行业中最具革命性的技术之一,凭借其更快的读写速度、增强的耐用性和能效,已经成为大多数用户的首选存储方案。然而,如同任何其他技术一样,SSD也面临自身的挑战…

C++——string类

前言:哈喽小伙伴们,从这篇文章开始我们将进行若干个C中的重要的类容器的学习。本篇文章将讲解第一个类容器——string。 目录 一.什么是string类 二.string类常见接口 1.string类对象的常见构造 2.string类对象的容量操作 3. string类对象的访问及遍…

大唐杯学习笔记:Day6

1.1小区选择 一、概述 1.UE在RRC_IDLE和RRC——INACTIVATE状态下进行的过程; 2.UE首先需要完成PLMN的选择,在已选择的PLMN上寻找合适的小区,获取合适的服务,监听控制信道,这个过程即小区选择过程; 3.根据小区重选准则,UE寻找其他更适合的小区进行小区…

德国Sentech自动扫描薄膜测量仪器SenSolH系列全套资源没有软件

德国Sentech自动扫描薄膜测量仪器SenSolH系列全套资源没有软件

JavaScript实现点击鼠标弹钢琴的效果

思路&#xff1a; 图片设置宽900px&#xff0c;找到鼠标按下时的x坐标和img距离body的x坐标&#xff0c;两个值相减&#xff0c;然后除100取整&#xff0c;赋值给a&#xff0c;通过判断a的值来确定放出那个音乐。 完整代码&#xff1a; <!DOCTYPE html> <html lan…

这些程序员交流学习的宝藏网站,无论你是大佬还是小白,都值得收藏!!!

正所谓&#xff0c;活到老学到老&#xff0c;无论我们身处何时何地&#xff0c;学习交流都可以让我们受益匪浅&#xff0c;掌握更多的知识技能&#xff0c;可以让我们在面对问题时多一份从容&#xff0c;可以让我们在关键时刻脱颖而出&#xff0c;那么&#xff0c;作为一个程序…

软考65-上午题-【面向对象技术】-面向对象分析、设计、测试

一、面向对象分析OOA 1-1、面向对象分析的定义 面向对象分析的目的&#xff1a;为了获得对应用问题的理解。理解的目的是确定系统的功能、性能要求。 面向对象分析包含5个活动&#xff1a;&#xff08;背&#xff01;&#xff09; 认定对象&#xff1b;&#xff08;重要一点…

springcloud:3.6测试信号量隔离

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…

全方位碾压chatGPT4的全球最强模型Claude 3发布!速通指南在此!保姆级教学拿脚都能学会!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

Mysql案例之GROUP_CONCAT函数详解

Hello&#xff0c;大家好&#xff0c;我是灰小猿&#xff0c;一个超会写bug的程序员&#xff01; 今天这篇文章记录一个最近开发中遇到的mysql实战场景&#xff0c;觉得还挺典型的&#xff0c;就在此做一下记录。 先看一下举例场景&#xff1a; mysql中学生表与学科表通过关…

基于springboot的蜗牛兼职网的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;蜗牛兼职网当然也不能排除在外。蜗牛兼职网是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c…

Android开发新手入门教程,华为大神花费5个月打造的这份714页学习笔记系列

前言 成为一个专业人士是所有程序员的目标&#xff0c;近几年的工作经历&#xff0c;近距离观察了很多大公司的大佬。有幸与其中的一部分一起工作。在此分享大牛程序员的行为风格以及我自己的所思所想&#xff0c;希望对大家有所帮助。 特此声明&#xff1a;此为我个人主观观点…

Linux学习-二级指针的使用

目录 ###指针传参时要用二级指针 ###函数体内部想要修改函数外部指针变量值的时候需要使用二级指针(指针变量的地址) ###指针传参时要用二级指针 char *str[5]; int Fun(char **ppstr,int len); ###函数体内部想要修改函数外部指针变量值的时候需要使用二级指针(指针变量的…

Docker部署(ruoyi案例接上篇Docker之部署前后端分离项目)实施必会!!!!

文章目录 Docker部署前端 Docker部署前端 接上篇博主已经部署好后端Docker部署后端&#xff0c;现在来讲解怎么部署前端 MySQL和redis是不依赖其他任何一个东西的&#xff0c; ruoyi-admin是因为你启动项目的时候是必须连接数据库的 现在去单独启动它 docker start ruoyi-a…

Java项目:39 springboot008房屋租赁系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 房屋租赁系统的设计基于现有的网络平台&#xff0c;主要有管理员、房东、用户三个角色 管理员可以在线查看系统已有的人中心、房屋类型管理、房屋信息…

vue实现虚拟键盘

本文介绍一体机常用的虚拟键盘实现&#xff0c;主打一个免费文章。喜欢就点个赞支持一下吧 simple-keyboard官网&#xff1a;simple-keyboard - simple-keyboard - Francisco HodgeSimple-keyboard is a virtual keyboard for Javascript. You can use it as an input for dev…