基于OpenCv的图像基本操作

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计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,将其转成RGBimg = 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.hqwc.cn/news/660300.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「C/C++ 01」类型转换与整型提升

目录 一、类型转换和截断问题 1. 隐式类型转换 2. 强制类型转换 3. 截断问题 二、整型提升 0. 算数表达式的计算过程 1. 整型提升是什么? 2. 为什么要整型提升? 3. 如何进行整型提升 4. 唯一的注意事项 5. 通过在vs中的监视窗口来观察整型提升 6. 整型…

PotatoPie 4.0 实验教程(36) —— FPGA实现摄像头图像二值化开运算效果

手机扫码 链接直达 https://item.taobao.com/item.htm?ftt&id776516984361 什么是图像开运算,有什么作用? 图像开运算是数学形态学中的一种图像处理操作,它由两个基本操作组成:腐蚀(Erosion)和膨胀…

73、栈-柱状图中最大的矩形

思路: 矩形面积:宽度*高度 高度如何确定呢?就是在宽度中最矮的元素。如何确定宽度,就是要确定左右边界。 当我们在处理直方图最大矩形面积问题时,遇到一个比栈顶柱子矮的新柱子时开始计算面积的原因关键在于如何确定…

opencv基础篇 ——(十)非真实感渲染

非真实感渲染(Non-Photorealistic Rendering, NPR)是指通过一系列图像处理技术,将真实感图像转换为具有特定艺术风格或视觉效果的图像,模拟绘画、素描、卡通等非现实主义表现手法。OpenCV 提供了一些内置函数来实现非真实感渲染&a…

74、堆-数组中的第K个最大元素

思路&#xff1a; 直接排序是可以的&#xff0c;但是时间复杂度不符合。可以使用优先队列&#xff0c;代码如下&#xff1a; class Solution {public int findKthLargest(int[] nums, int k) {if (numsnull||nums.length0||k<0||k>nums.length){return Integer.MAX_VAL…

全域团购外卖SAAS系统是什么?

随着多家互联网平台的团购外卖板块逐渐稳定&#xff0c;不少人不再满足于只做1~2个平台的团购外卖服务商&#xff0c;想要拓宽业务范围。在此背景下&#xff0c;全域团购外卖SAAS应运而生&#xff0c;进一步推动了全域团购外卖的流行。 而所谓全域团购外卖&#xff0c;就是指所…

Android Perfetto 监控应用启动耗时

Perfetto 是一个 Google 开发的用于安卓系统性能监控和调试的工具&#xff0c;它旨在提供实时数据收集和可视化功能&#xff0c;帮助我们分析和优化应用程序的性能表现。Perfetto 可以捕获系统事件、CPU、内存、网络、GPU 等性能指标数据&#xff0c;并将其记录为轻量级的 Trac…

链表刷题集

文章目录 概要反转链表代码Python代码C 环形链表代码Python代码Java 小结 概要 这个主要记录下刷的一些题。 链表已经看过了&#xff0c;之前写了篇链表的文章&#xff0c;这一篇&#xff0c;写点跟链表有关的题。主要是leetcode上的。目的是熟悉下代码&#xff0c;代码这东西…

2024 JAVA Tinypng压缩图片,超级简单!!!

一、打开官网&#xff0c;注册账号&#xff0c;获取秘钥&#xff08;每个月500张免费&#xff09; 1.打开官网&#xff0c;注册账号 TinyPNG – Compress WebP, PNG and JPEG images intelligently 2.登录后&#xff0c;点击账号名字&#xff0c;找到如图所示 3.找到API&…

当众演讲技巧的方法有哪些(3篇)

当众演讲技巧的方法有哪些&#xff08;3篇&#xff09; 当众演讲技巧的方法有很多&#xff0c;下面我将分三篇来详细阐述其中的一些关键技巧&#xff1a; **篇&#xff1a;准备与开场技巧 充分准备&#xff1a;提前规划演讲内容&#xff0c;明确主题和目标&#xff0c;准备详…

螺旋角和导程、转位后的齿轮有什么关系?

最近和小伙伴聊到了一个问题&#xff1a;斜齿轮螺旋角和导程的关系&#xff0c;主要是在遇到在采用转位设计方式的刀具时&#xff0c;更觉得有点迷惑&#xff0c;今天咱们就聊聊这个事儿。 先来说斜齿轮螺旋角和导程的关系&#xff1a; 斜齿轮是有多个螺旋面组成的&#xff0…

解决RTC内核驱动的问题bm8563

常用pcf-8563 , 国产平替BM8563(驱动管脚一致)&#xff1b; 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟&#xff0c;可以使用专用的实时时钟芯片来完成此功能 RTC 设备驱动是一个标准…