OpenCV学习小记

news2025/1/12 1:56:02

OpenCV学习小记

    • 🎈🎈记在最前
    • 🎈🎈图像处理的基本操作
      • ✨读取图像
      • ✨显示图像
      • ✨保存图像
      • ✨获取图像属性
    • 🎈🎈像素的操作
      • ✨像素
        • 🔔获取像素的BGR值
        • 🔔修改像素的BGR值
      • ✨使用NumPy模块操作像素
        • 🔔NumPy综述
        • 🔔NumPy数据类型
        • 🔔创建数组

🎈🎈记在最前

OpenCV对于图像的处理是基于BGR的,与常规RGB不同,处理时要注意通道顺序,若对图像进行输、保存,需要转为RGB才能使色彩正常显示

🎈🎈图像处理的基本操作

✨读取图像

  • imread()方法用于读取图像
image = cv2.imread(filename, flags)

'''
image = cv2.imread("D:/3.1.jpg") # 路径中不能出现中文
#  "D:/3.1.jpg"等价于"D:\\3.1.jpg"
'''

在这里插入图片描述

灰度图像是一种每个像素都是从黑到白,被处理为256个灰度级别的单色图像。256个灰度级别分别用0(纯黑色)~255(纯白色)的数值表示。

✨显示图像

如果能够将这幅图像显示出来,就可以更加直观地看到它。为此,OpenCV提供了imshow()方法、waitKey()方法和destroyAllWindows()方法。

  • imshow()方法用于显示图像
cv2.imshow(winname, mat)

'''
cv2.imshow("NBA",image)
'''

在这里插入图片描述

  • waitKey()方法用于等待用户按下键盘上按键的时间。当用户按下键盘上的任意按键时,将执行waitKey()方法,并且获取waitKey()方法的返回值。
retval = cv2.waitKey(delay)

'''
pkey = cv2.waitKey()    #  无限等待直到按键按下
cv2.waitKey(1000)   #  图像最大显示1s
'''

在这里插入图片描述

  • destroyAllWindows()方法用于销毁所有正在显示图像的窗
cv2.destroyAllWindows()

✅✅✅

读取、输出NBA.png图像,输出触发关闭事件按键(最大等待5s后自动关闭)

import cv2
image = cv2.imread("NBA.png")
cv2.imshow("NBA",image)
pkey = cv2.waitKey(5000)        #  最大等待5s
cv2.destroyAllWindows()
print(pkey)     #  输出触发按键ASCII码


'''
#  常用图像输出(输出图像,按下任意键关闭)
cv2.imshow("NBA",image)
cv2.waitKey()
cv2.destroyAllWindows()
'''

✨保存图像

  • imwrite()方法用于按照指定路径保存图像
cv2.imwrite(filename, img)

'''
import cv2
image = cv2.imread("3.1.jpg") # 读取3.1.jpg
#  把3.1.jpg保存为E盘根目录下的、Pictures文件夹中的1.jpg
cv2.imwrite("E:/Pictures/1.jpg", image)
'''

在这里插入图片描述

✨获取图像属性

OpenCV提供了shape、size和dtype 3个常用属性

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

import cv2

image = cv2.imread("NBA.png")
print("彩色图像属性:")
print("Shape:",image.shape)
print("Siza:",image.size)
print("Dtype:",image.dtype)

image1 = cv2.imread("NBA.png",0)
print("灰色图像属性:")
print("Shape:",image1.shape)
print("Siza:",image1.size)
print("Dtype:",image1.dtype)

'''
(500, 667, 3)的含义是NBA.png的垂直像素是500,水平像素是667,通道数是3。
(500, 667)的含义是NBA.png转换的灰度图像的垂直像素是500,水平像素是667,通道数是1。
'''

在这里插入图片描述

🎈🎈像素的操作

像素是图像的最小单位。每一幅图像都是由M行N列(对应像素下标[0 ~ M-1,0 ~ N-1])的像素组成的,其中每一个像素都存储一个像素值。以灰度图像为例,计算机通常把灰度图像的像素处理为256个灰度级别,256个灰度级别分别使用区间[0, 255]中的整数数值表示。其中,“0”表示纯黑色;“255”表示纯白色。

✨像素

🔔获取像素的BGR值

  • 同时获取
import cv2

image = cv2.imread("NBA.png")
px = image[200, 230]		# 坐标(200, 230)上的像素
print(px)

'''
[ 72  92 100]
'''
  • 分别获取
import cv2

image = cv2.imread("NBA.png")
B = image[200, 230, 0]
R = image[200, 230, 1]
G = image[200, 230, 2]
print('B:',B)
print('R:',R)
print('G:',G)


'''
B: 72
R: 92
G: 100
'''

🔔修改像素的BGR值


✅✅✅ 将图中的坐标(241, 168)、(241, 218)、(291, 168)和(291, 218)的4个点所围成的区域内的所有像素都修改为纯白色
import cv2
image = cv2.imread("NBA.png")
for i in range(241, 292):
    for j in range(168, 219):
        image[i][j] = 255
cv2.imshow('NBA',image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

✨使用NumPy模块操作像素

🔔NumPy综述

NumPy更像是一个魔方,它是Python数组计算、矩阵运算和科学计算的核心库,NumPy来源于
Numerical和Python两个单词。NumPy提供了一个高性能的数组对象,以及可以轻松创建一维数组、二维数组和多维数组等大量实用方法,帮助开发者轻松地进行数组计算,从而广泛地应用于数据分析、机器学习、图像处理和计算机图形学、数学任务等领域中。由于NumPy是由C语言实现的,所以其运算速度非常快。

🔔NumPy数据类型

为了区别于Python数据类型,NumPy中的bool、int、float、complex等数据类型名称末尾都加了短下画线“_”

在这里插入图片描述

每一种数据类型都有相应的数据转换方法
np.int8(3.141)
np.float64(8)
np.float(True)

🔔创建数组

  • 最常规的array()方法
numpy.array(object, dtype, copy, order, subok, ndmin)

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

import numpy as np

list = [1, 2, 3]

n1 = np.array(list) #  创建一个简单的一维数组
n2 = np.array([0.1, 0.2, 0.3]) #  创建一个包含小数的一维数组
n3 = np.array([[1, 2], [3, 4]]) #  创建一个简单的二维数组


''' 创建浮点型数组 '''
n4 = np.array(list, dtype=np.float_) #  创建一个浮点型数组
n4 = np.array(list, dtype=float) #  效果同上


''' 创建三维数组 '''
nd3 = np.array(list, ndmin=3) #  创建三维数组

print(n1)
print(n2)
print(n3)
print(n4)
print(n4.dtype)
print(type(n4[0]))
print(nd3)

在这里插入图片描述

  • 创建指定维度和数据类型未初始化的数组

创建指定维度和数据类型未初始化的数组主要使用empty()方法,数组元素因为未被初始化会自动取随机值。如果要改变数组类型,可以使用dtype参数,如将数组类型设为整型,dtype=int。

import numpy as np
n = np.empty([2, 3])
print(n)

'''
[[0.   0.15 0.25]
 [0.5  0.75 1.  ]]
'''
  • 创建用0填充的数组

创建用0填充的数组需要使用zeros()方法,该方法创建的数组元素均为0,OpenCV经常使用该方法创建纯黑图像。

import numpy as np
n = np.zeros((3, 3), np.uint8)
print(n)

'''
[[0 0 0]
 [0 0 0]
 [0 0 0]]
'''
  • 创建用1填充的数组

创建用1填充的数组需要使用ones()方法,该方法创建的数组元素均为1。OpenCV经常使用该方法创建纯掩模、卷积核等用于计算的二维数据。

import numpy as np
n = np.ones((3, 3), np.uint8)
print(n)

'''
[[1 1 1]
 [1 1 1]
 [1 1 1]]
'''
  • 创建随机数组

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

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

相关文章

2023年值得关注的20大网络安全趋势

随着围绕所有企业的数字革命,无论大小,企业、组织甚至政府都依赖计算机化系统来管理他们的日常活动,从而使网络安全成为保护数据免受各种在线攻击或任何未经授权访问的主要目标。 随着数据泄露、勒索软件和黑客攻击的新闻成为常态&#xff0…

基于计算机视觉的手势识别技术

一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion:2023.5.2 Last edited: 2023.5.2 手语是一种主要由听力困难或耳聋的人使用的交流方式。这种基于手势的语言可以让人们轻松地表达想法和想法&…

RTT开发之windows 环境配置

1. 安装python 有些文章说支持2.7, 实测3.9环境也是OK的 2. 安装scons组件 其他文章多是下载安装,实际操作麻烦还成功率低, 直接pip安装 pip install scons 然后命令测试 D:\rt-thread-5.0.0\bsp\wch\arm\ch579m>scons scons: Readin…

【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

HJ51 输出单向链表中倒数第k个结点

写在前面: 做题环境如下: 题目渠道:牛客网 HJ51 输出单向链表中倒数第k个结点 华为机试题 编程语言:C 一、题目描述 描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针…

这就是二分查找?(C语言版)

大家好!我又来了,哈哈~今天我要和大家分享一种神奇的算法——二分查找!你可能会问,“二分查找有什么好玩的?”但在我看来它就像一场魔法表演,当你输入一个数,他会在一堆数中快速找到它的位置。找…

day10 TCP是如何实现可靠传输的

TCP最主要的特点 1、TCP是面向连接的运输层协议。( 每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)) 2、TCP提供可靠交付的服务。 3、TCP提供全双工通信。 4…

HTTP第一讲——HTTP是什么?

定义: HTTP 就是超文本传输协议,也就是 HyperText TransferProtocol。 HTTP 的名字是“超文本传输协议”,它可以拆成三个部分,分别是:“超文本”、“传输”和“协议”。 首先,HTTP 是一个协议。不过&…

Swagger使用手册

目录 Swagger 的依赖Swagger 的配置Swagger 生成的测试页面地址Swagger 的注解遇到过的问题提示 documentationPluginsBootstrapper 空指针异常 Swagger 的依赖 <!--swagger2--> <dependency><groupId>io.springfox</groupId><artifactId>sprin…

【MATLAB图像处理实用案例详解(23)】——基于形态学处理的焊缝边缘检测算法

目录 一、问题描述二、图像预处理2.1 中值滤波去噪2.2 白平衡处理 三、焊缝边缘检测3.1 Sobel算子边缘检测3.2 Prewitt算子边缘检测3.3 Canny算子边缘检测3.4 形态学处理边缘检测 四、结果分析 一、问题描述 目前很多机械关键部件均为钢焊接结构&#xff0c;钢焊接结构易出现裂…

SSL证书支持IP改成https地址

我们都知道SSL证书能为域名加密&#xff0c;那么IP地址可以实现https加密吗&#xff1f;答案当然是肯定的。为IP地址进行https加密不仅能保护IP服务器与客户端之间数据传输安全&#xff0c;还能对IP服务器进行身份验证&#xff0c;确保用户信息安全&#xff0c;增强用户对IP地址…

Python每日一练(20230502)

目录 1. 被围绕的区域 &#x1f31f;&#x1f31f; 2. 两数之和 II &#x1f31f; 3. 二叉树展开为链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1…

【操作系统OS】学习笔记:第一章 操作系统基础【哈工大李治军老师】

基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记&#xff0c;仅进行交流分享。 特此鸣谢李治军老师&#xff0c;操作系统的神作&#xff01; 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0…

【前端知识】Cookie, Session,Token和JWT的发展及区别(中)

【前端知识】Cookie, Session&#xff0c;Token和JWT的发展及区别&#xff08;中&#xff09; 4. Session4.1 Session的背景及定义4.2 Session的特点&#x1f44d;4.2.1 Session的特点&#x1f440;4.2.2 Session保存的位置 4.3 Session的一些重要/常用属性4.4 Session的认证流…

算法之美~分治算法

如何理解分治算法&#xff1f; 分治算法&#xff08;divide and conquer&#xff09;的核心思想其实是&#xff0c;分而治之&#xff0c;也就是将原问题划分成n个规模较小&#xff0c;并且结构与原问题相似的子问题&#xff0c;递归第解决这些子问题&#xff0c;然后再合并其结…

什么是 Docker?它能用来做什么?

文章目录 什么是云计算&#xff1f;什么是 Docker&#xff1f;虚拟化技术演变特点架构镜像&#xff08;Image&#xff09;仓库&#xff08;Registry &#xff09;容器&#xff08;Container&#xff09; 应用场景 什么是云计算&#xff1f; 云计算是一种资源的服务模式&#x…

应急响应概述

一、应急响应事件类型 常见的应急响应事件分类&#xff1a; Web 入侵&#xff1a;主页篡改、Webshell 系统入侵&#xff1a;病毒木马、勒索软件、远控后门 网络攻击&#xff1a;DDOS 攻击、DNS 劫持、ARP 欺骗 二、可疑账号排查 2.1Windows 1&#xff09;‘WinR’…

世界坐标系、相机坐标系和图像坐标系的转换

本文转载于&#xff1a;https://blog.csdn.net/weixin_38842821/article/details/125933604?spm1001.2014.3001.5506 1. 世界坐标 世界坐标系是一个特殊坐标系&#xff0c;它建立了描述其他坐标系需要的参考框架。能够用世界坐标系描述其他坐标系的位置&#xff0c;而不能用更…

stack、queue和priority_queue的使用介绍--C++

一、stack介绍 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供一组…

YOLOv5 更换Neck之 BiFPN:如何替换YOLOv5的Neck实现更强的检测能力?

目录 一、BiFPN是什么&#xff1f;1、什么是BiFPN2、BiFPN的优势 二、为什么要用BiFPN替换YOLOv5的Neck&#xff1f;1、YOLOv5原有的Neck存在的问题2、BiFPN的适用场景 三、如何在YOLOv5中实现BiFPN1、下载并替换BiFPN代码2、修改配置文件3、遇到的问题及解决方法 四、BiFPN超参…