基于OpenCv的图像基本操作

news2024/12/24 9:03:44

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

基于OpenCv的图像基本操作

  • 基于OpenCv的图像基本操作
    • 任务需求
    • 任务目标
      • 1、掌握图像的读取、显示和保存
      • 2、掌握图像的ROI区域提取
      • 3、掌握图像的颜色通道提取
      • 4、掌握图像的色彩空间转换
    • 任务环境
      • 1、jupyter开发环境
      • 2、OpenCv
      • 3、python3.6
    • 任务实施过程
      • 一、图像的读取、显示和保存
        • 1、图像读取
        • 2、图像显示
        • 3、图像保存
      • 二、图像的ROI区域
      • 三、图像的颜色通道提取
      • 四、图像的色彩空间转换
      • 五、任务小结
  • 说明

基于OpenCv的图像基本操作

任务需求

本实验主要完成基于OpenCv的图像的基本操作、图像的ROI区域提取以及图像的色彩空间转换

  • 图像的基本操作包括图像的读取、显示和保存。
  • 图像的ROI区域提取表示图像感兴趣的区域提取,也就是最能表现图像内容的区域,图像ROI提取技术广泛应用于压缩编码、图像检索,目标检测等。
  • 通常需要根据实际应用环境选择合适的颜色空间,数字图像处理中常用的颜色空间有RGB,YUV,HSI等,它们具有不同的特性和适用范围,相互之间存在一定的转换关系,可根据实际需要进行相互转换

在这里插入图片描述

任务目标

1、掌握图像的读取、显示和保存

2、掌握图像的ROI区域提取

3、掌握图像的颜色通道提取

4、掌握图像的色彩空间转换

任务环境

1、jupyter开发环境

2、OpenCv

3、python3.6

任务实施过程

一、图像的读取、显示和保存

1、图像读取

在这里插入图片描述

cv2.imread(path, flag) 从指定的文件加载图像,如果无法读取图像,则返回一个空矩阵。
参数:
- path:一个字符串,代表要读取的图像的路径。
- flag:它指定应该读取图像的方式。默认值为cv2.IMREAD_COLOR
- cv2.IMREAD_COLOR:彩色图像
- cv2.IMREAD_GRAYSCALE:灰度图像
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline 
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像,这里读取的是彩色图像
img = cv2.imread(r'./experiment/data/Doraemon.jpg') 
# 显示读取的图像,读取到的是一个三维矩阵
print(img)

在这里插入图片描述

# 查看矩阵的形状
print('矩阵形状',img.shape)
print('图像高x宽x通道数的总个数',img.size)

在这里插入图片描述

2、图像显示
cv2.imShow(wname,img)函数可以在窗口中显示图像。该窗口和图像的原始大小自适应(自动调整到原始尺寸)。
- wname:是窗口的名字
- img:要显示的图像
- cv2.waitKey:等待键盘输入,单位为毫秒,参数为0表示无限等待。
- cv2.destroyAllWindow():能正常关闭所有的绘图窗口
# # 图像的显示,也可以创建多个窗口,但窗口的名字必须不同
# cv2.imshow('image',img) 
# # 等待时间,毫秒级,0表示任意键终止
# cv2.waitKey(0) 
# cv2.destroyAllWindows()

本实验环境使用opencv库不能显示图像,所以使用matplotlib模块显示图像,定义显示图像函数

# 使用matplotlib显示图像
# 定义一个显示图像的函数
def im_show(name,img):
    # 若图像的矩阵是三维的那么绘制彩色图像
    if img.ndim==3:
        # opencv图像读取的格式是BGR,将其转成RGB
        img = img[:,:,::-1]
        # 可以使用plt.imshow()显示图像
        plt.imshow(img)
        plt.title(name)
        # 不显示x轴和y轴
        plt.xticks([])
        plt.yticks([])
    # 若图像的矩阵是二维的那么绘制灰度图
    elif img.ndim==2:
        # cmap='gray'表示绘制灰度图像
        plt.imshow(img,cmap='gray')
        plt.title(name)
        # 不显示x轴和y轴
        plt.xticks([])
        plt.yticks([])
    else:
        print('NONE')
# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
# 显示读入的图像
im_show('image',img)

在这里插入图片描述

3、图像保存
# 首先通过numpy创建一个长、宽各为300的矩阵,设置数据格式为uint8
img1 = np.mat(np.zeros((300,300)),dtype = np.uint8)
img1

在这里插入图片描述

# 显示图像,得到一张全黑的图像 
# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
im_show('image1',img1)

在这里插入图片描述

# 得到的图像矩阵是二维的
img1.shape

在这里插入图片描述

# 利用ndarray数组的操作来修改图片的颜色
# 对图片画横、竖两条白线
# 设图像第10行和第10列的像素值为255
img1[:,10] = 255 
img1[10,:] = 255
# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
# 显示图像
im_show('image3',img1)

在这里插入图片描述

cv2.imwrite(file,img,num) 图像保存函数
- file:要保存的文件名
- img:要保存的图像
- num:它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3
# 保存图像
cv2.imwrite('black.jpg',img1)

在这里插入图片描述

二、图像的ROI区域

在图像处理领域,感兴趣区域(ROI) 是从图像中选择的一个图像区域,这个区域是你的图像分析所关注的重点。ROI区域意为截取部分图像数据,表示感兴趣的区域。

# 通过数组使用索引或者切片,选择感兴趣的像素点/区域
# 截取显示图片中的人物大雄
dx = img[0:200,0:200]
# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
im_show('image4',dx)

在这里插入图片描述

三、图像的颜色通道提取

一张彩色图像由三个彩色图像分量组合成。通过RGB(红色、绿色、蓝色)三种颜色分量的叠加来得到各种颜色。

# 使用cv2.split()进行通道拆分,注意opencv的顺序是BGR
b,g,r=cv2.split(img)
# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
im_show('红色通道灰度图',r)
print('红色通道矩阵形状',r.shape)

在这里插入图片描述

# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
im_show('绿色通道灰度图',g)
print('绿色通道矩阵形状',g.shape)

在这里插入图片描述

# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
im_show('蓝色通道灰度图',b)
print('蓝色通道矩阵形状',b.shape)

在这里插入图片描述

四、图像的色彩空间转换

OpenCV提供了150多种颜色空间转换方法。本次实验中我们只研究BGR向RGB、Gray、HSV的转换。
cv.cvtColor(input_image,flag)颜色空间转换函数

  • input_image:需要转换的图片
  • flag:转换成何种格式
  • cv2.COLOR_BGR2RGB:BGR→RGB转换
  • cv2.COLOR_BGR2GRAY:BGR→Gray转换
  • cv2.COLOR_BGR2HSV:BGR→HSV转换
# 将图像img转换成三种色彩空间:RGB、GRAY、HSV
img_rgb = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 设置子图的标题和子图显示的图片
images = [img, img_rgb, img_gray, img_hsv]
titles = ['BGR', 'RGB', 'GRAY', 'HSV']
# 设置绘制图像的画布大小
plt.figure(figsize = (12,12))
# 绘制4幅子图
for i in range(4):
    plt.subplot(2, 2, i + 1)
    if images[i].ndim ==3:   
        # 可以使用plt.imshow()显示图像
        plt.imshow(images[i])
        plt.title(titles[i])
        # 不显示x轴和y轴
        plt.xticks([])
        plt.yticks([])
    # 若图像的矩阵是二维的那么绘制灰度图
    elif images[i].ndim==2:
        # cmap='gray'表示绘制灰度图像
        plt.imshow(images[i],cmap='gray')
        plt.title(titles[i])
        # 不显示x轴和y轴
        plt.xticks([])
        plt.yticks([])
plt.tight_layout()

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

五、任务小结

本实验主要完成基于OpenCv的图像的基本操作(图像的读取、显示和保存)、图像的ROI区域提取以及图像的色彩空间转换。

通过本次实验需要掌握以下内容:

  • 1.掌握图像的读取、显示和保存
  • 2.掌握图像的ROI区域提取
  • 3.掌握图像的颜色通道提取
  • 4.掌握图像的色彩空间转换

–end–

说明

本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我

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

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

相关文章

Multi-Head Multi-Loss Model Calibration论文速读

文章目录 Multi-Head Multi-Loss Model Calibration摘要方法Multi-Head Ensemble Diversity 实验结果 Multi-Head Multi-Loss Model Calibration 摘要 当然,我会按照你的要求逐步列出: 背景: 提供有意义的不确定性估计对于机器学习模型在…

前端打包过大如何解决?

前端开发完毕部署到线上是,执行npm run build。当打包过大时,部署到服务端后加载缓慢,如何优化? 我们可以通过执行npm run analyze。可以看到各个包文件大小的区别。 当打包过大时,通过压缩gzip的方式,可以…

数据结构——栈的应用

数据结构——栈的应用 括号匹配中缀转后缀什么是中缀后缀中缀表达式 (Infix Notation)后缀表达式 (Postfix Notation, Reverse Polish Notation, RPN) 加减,乘除运算处理括号后缀转中缀 我们今天来看栈的应用: 括号匹配 栈一个经典的应用就是括号匹配&…

前端如何将接口传来的列表数据(数组)直接下载成csv文件

前言:最近遇到一个需求,需要实现一个下载表格数据的操作,一般来说是前端请求后端的下载接口,将文件流下载下来,但是因为这个项目任务时间比较紧,后端没时间做下载接口,所以暂时由前端直接调列表…

[iOS]使用CocoaPods发布公开库

1.检查库名是否已被占用 选择库名时,尽量选择具有描述性并且独特的名字,这不仅可以避免命名冲突,还可以帮助用户更好地理解库的用途和功能。 在实际创建和发布 CocoaPods 库之前,确实应该检查库名是否已经被占用,以避…

C++ | Leetcode C++题解之第58题最后一个单词的长度

题目: 题解: class Solution { public:int lengthOfLastWord(string s) {int index s.size() - 1;while (s[index] ) {index--;}int wordLength 0;while (index > 0 && s[index] ! ) {wordLength;index--;}return wordLength;} };

HTTP:强缓存优化实践

强缓存:浏览器不会向服务器发送任何请求,直接从本地缓存中读取文件 强缓存是指浏览器在向服务器请求资源时,判断本地是否存在该资源的缓存,并判断是否过期。 如果本地缓存未过期,浏览器就直接使用本地缓存&#xff0c…

Threejs制作服务器机房冷却结构

这节再绘制一个机房的结构,因为内容比较简单,就只使用一个章节来介绍, 先来一张效果图, 需要两个模型:一个冷却设备,一个服务器机箱,我这里是从网上找来的,首先我们搭建一个场景&a…

AWTK 集成 OGRE 3D 图形引擎

本项目演示了如何在 AWTK 中集成 OGRE3D。 0. 准备 先编译 AWTK, 并在 env.sh 中设置 awtk 的路径。需要安装 cmake 1. 生成资源 python scripts/update_res.py all2. 编译 设置环境变量 source env.sh source env_rt.sh编译 ogre 库 cd 3rd build_assimp.sh build_ogre.…

我们自己的芯片指令集架构——龙芯架构简介

CPU指令集架构(ISA, Instruction Set Architecture) CPU指令集架构是处理器硬件与软件之间的接口规范,它定义了一组基本指令,以及这些指令的操作格式、编码方式、寻址模式、寄存器组织、中断机制、异常处理等各个方面。ISA是计算…

uniApp+Vue3+vite+Element UI或者Element Plus开发学习,使用vite构建管理项目,HBuilderX做为开发者工具

我们通常给小程序或者app开发后台时,不可避免的要用到可视化的数据管理后台,而vue和Element是我们目前比较主流的开发管理后台的主流搭配。所以今天石头哥就带大家来一起学习下vue3和Element plus的开发。 准备工作 1,下载HBuilderX 开发者…

Camera设备上晶体晶振的应用

IPC行业现状的分析 IP Camera起源于20世纪90年代,最早应用于监控系统中。 随着AI技术、云服务以及IoT技术的发展,IPC已经从安防监控向智慧城市、智能家居、自动驾驶、智能医疗等行业领域拓展,不单单传统地应用于工业,个人和家庭的…

《QT实用小工具·四十八》趣味开关

1、概述 源码放在文章末尾 该项目实现了各种样式的趣味开关: 1、爱心形状的switch开关,支持手势拖动、按压效果 2、线条样式的3种开关 项目demo演示如下所示: 使用方式: 1、sapid_switch文件夹加入工程,.pro文件中…

ActiveMQ 反序列化漏洞 (CVE-2015-5254)

一、漏洞描述 Apache ActiveMQ 是由美国阿帕奇(Apache)软件基金会开发的开源消息中间件,支持 Java 消息服务、集群、Spring 框架等。属于消息队列组件(消息队列组件:分布式系统中的重要组件,主要解决应用耦合、异步消息…

基于SpringBoot+Vue大学生兼职管理系统的设计与实现

目录 一、前言介绍 二、功能需求 三、功能结构设计 四、管理员功能实现 招聘单位管理 用户管理 论坛管理 公告信息管理 五、招聘单位功能实现 职位招聘管理 职位留言管理 简历投递管理 六、用户功能实现 在线论坛 职位招聘信息 简历投递 简历 七、部分核心代码 …

深入Rust标准库:必备的Rust语言高级指南

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

windows rabbitMq安装

一、Erlang 环境准备 下载安装包 跟我们跑java项目,要装jdk类似。rabbitMQ是基于Erlang开发的,因此安装rabbitMQ服务器之前,需要先安装Erlang环境。 官网直接下载windows直装版本:https://www.erlang.org/downloads 无脑安装&a…

用自然语言来编程GitHub Copilot;提高代码质量开源工具GPTLint;LLMs开源医学Meditron

✨ 1: GitHub Copilot Workspace 以Copilot 为中心的创新开发者环境,让开发者能用自然语言从构思到编码再到软件开发。 GitHub Copilot Workspace是一个以Copilot为中心的开发者环境,旨在使用自然语言从构思、编码到软件开发的全过程中提供帮助。它标志…

一、OSPF基础

目录 1.路由协议的优先级 2.转发原则:最长匹配原则 3.负载分担 4.路由备份(浮动路由) 5.路由协议的分类 6.动态路由 7.距离矢量路由协议(BGP,RIP) 8.链路状态路由协议(OSPF,I…

指纹浏览器:网络安全与隐私的新工具

在互联网时代,隐私和网络安全成为人们越来越关注的话题。随着数字化的发展,个人信息的泄露和在线追踪的问题愈发严峻。在这个背景下,"指纹浏览器"作为一种新型工具,开始受到关注。撸空投需要了解指纹浏览器。本文将深入…