当前位置: 首页 > article >正文

《OpenCV 图像基础操作全解析:从读取到像素处理与 ROI 应用》

在这里插入图片描述

简介:本文详细介绍了使用 OpenCV 进行图像相关操作的基础知识与实践示例,涵盖图像读取(包括不同读取方式及对应效果)、灰度值概念与图像矩阵存储特点、通道相关知识(如 BGR、通道拆分与合并),还展示了像素处理及感兴趣区域(ROI)操作,包含像素修改、图像缩放等内容,并通过具体的图片示例辅助理解,帮助读者快速掌握 OpenCV 在图像基础处理方面的运用。
如果你觉得我的文章对你的OpenCV学习有所帮助,请你点赞收藏关注,学习更多和OpenCV相关的知识

OpenCV:图像的读取与保存

  • 1 读取图像
    • 1.1 cv2.imread
    • 1.2灰度值
    • 1.3通道与BGR
    • 1.4 通道的拆分与合并
  • 2 像素的处理与ROI
    • 2.1 像素修改图片
    • 2.2缩放与ROI
  • 致谢

1 读取图像

比如我们的项目下面有一张图片,(至于这个图片,你们可以选择自己喜欢的图片,也可以截图我的图片,然后重命名,大家随意就行):
在这里插入图片描述
我们要把他读取到项目中,需要使用cv2.imread函数

1.1 cv2.imread

cv2.imread( 参数1 :filename,参数2:flags)
filename:读取的文件名,如果和代码不在同一文件夹下,要加上文件的路径
flags:读取方式,默认值为1,默认读取为BGR图像。(如果您不了解什么是BGR,稍安勿躁,我会在1.3中讲解)。-1是保持图片原格式不变,0是转变为单通道的灰度值图像(不了解通道和灰度值也不要急我会在1.3讲通道 1.2讲灰度值)
理论说这么多不如运行一下看看结果

import cv2
import matplotlib.pyplot as plt
image_pig = cv2.imread("pig.jpg")
cv2.imshow("show_pig",image_pig)
cv2.waitKey()
cv2.destroyAllWindos()

在这里插入图片描述
现在把文件读取方式改为0看一下情况

image_pig = cv2.imread("pig.jpg",flags = 0)

在这里插入图片描述
这是一幅灰度值图像,我们将在1.2中讲解

1.2灰度值

我们输出一下他的矩阵内容

import numpy as np
import cv2
import matplotlib.pyplot as plt
image_pig = cv2.imread("pig.jpg",flags = 0)

print(type(image_pig))
print(image_pig)
print(image_pig.shape)

在这里插入图片描述
这个结果说明OpenCV读取到的图像是按numpy中的ndarray数组类型存储的。920,684是他的高和宽。他的每一个数据代表这这一个像素点的灰度值,灰度值是从0-255.比如我们创建一个全0矩阵

import numpy as np
import cv2
black_image = np.zeros([300,300],dtype = np.uint8)
cv2.imshow('black',black_image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
他就是一张黑色的图像,我们现在创建一个全255的矩阵

import numpy as np
import cv2
black_image = 255*np.ones([300,300],dtype = np.uint8)
cv2.imshow('black',black_image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

1.3通道与BGR

要讲明白通道,就要从BGR 是什么开始讲,首先我们要知道BGR代表着彩色图片,或者说他能呈现彩色图片。回到彩色猪猪图,运行一下代码看一下

import cv2
import numpy as np
image_pig = cv2.imread("pig.jpg")
print(image_pig.shape)

在这里插入图片描述
而灰度图像的运行结果呢,代码你们可以往上翻,我这里直接把运行结果复制下来
在这里插入图片描述
发现区别了吧,就是前者是一个shape为[height,width,通道数]的数组,而灰度值图像的通道数为1。
BGR:就是蓝色 绿色 红色灰度值的叠加,B G R 是矩阵存储的顺序,我给大家拆分一下。拆分之前要补充一个知识点通道拆分,请见1.4

1.4 通道的拆分与合并

cv2.split()函数可以把通道拆分
cv2.merge()函数可以把通道合并
复制下面的这段代码运行一下,这段代码讲了将pig.jpg拆分成bgr三个通道,以及融合成rgb

import cv2
import matplotlib.pyplot as plt
image_pig = cv2.imread("pig.jpg")
b,g,r = cv2.split(image_pig)
cv2.imshow("original_image",image_pig)
cv2.imshow("blue_channel",b)
cv2.imshow("green_channel",g)
cv2.imshow("red_channel",r)
rgb_image_pig = cv2.merge([r,g,b])
cv2.imshow("r_g_b_image",rgb_image_pig)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

2 像素的处理与ROI

这一章的重点在于ROI,先知道可以修改,然后在选择特定区域ROI完成简单图像处理

2.1 像素修改图片

还是拿猪猪侠的图片举例子,比如我想把猪头给截取下来,应该这么做

import cv2
import matplotlib.pyplot as plt
image_pig = cv2.imread("pig.jpg")
print(image_pig.shape)
ROI_image = image_pig[200:500,100:450]
cv2.imshow("pig_head",ROI_image)
cv2.waitKey()
cv2.destroyAllWindows()
# cv2.imshow("show_pig",image_pig)
# cv2.waitKey()
# cv2.destroyAllWindows()

在这里插入图片描述
,我现在想把他换到超人强的头脑上。我在我的文件夹中加入了从网上截取的一张图片起名叫做blue_pig.JPG
在这里插入图片描述
然后再导入超人强,找一些超人强脑袋的位置

import cv2
import numpy as np
blue_pig = cv2.imread("blue_pig.JPG")
print(blue_pig.shape)
Roi_blue = blue_pig[20:160,10:210]
cv2.imshow("blue_head",Roi_blue)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
现在我们遇到了问题,这两部分图片大小不一致,所以我们要进行缩放,请到2.2学习缩放

2.2缩放与ROI

image_return = cv2.resize(缩放的原始图像,输出图像大小 ,水平方向缩放比例fx,竖直方向缩放比例fy)
如果设置了输出图像大小dsize,就不需要在设置缩放比例。
我们现在就可以实现把猪猪侠的脑袋缩放成更超人强的脑袋一般大小然后替换

import cv2
import matplotlib.pyplot as plt
image_pig = cv2.imread("pig.jpg")
print(image_pig.shape)
ROI_image = image_pig[200:500,100:450]

blue_pig = cv2.imread("blue_pig.JPG")
print(blue_pig.shape)
Roi_blue = blue_pig[20:160,10:210]
ctrl_c_read_roi = cv2.resize(ROI_image,(200,140))
blue_pig[20:160,10:210] = ctrl_c_read_roi

cv2.imshow("multi_red_and_blue",blue_pig)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

致谢

本文参考了一些博主的文章,博取了他们的长处,也结合了我的一些经验,对他们表达诚挚的感谢,使我对OpenCV 的使用有更深入的了解,也推荐大家去阅读一下他们的文章。纸上学来终觉浅,明知此事要躬行:
图片缩放cv2.resize()详解
[opencv教程(三)]ROI区域(图片截取)
【OpenCV】BGR三色通道的提取与合并–超详细解读


http://www.kler.cn/a/405901.html

相关文章:

  • 图的各种应用
  • 时序论文23|ICML24谷歌开源零样本时序大模型TimesFM
  • 格式化输入输出【专辑优质版】
  • Android 网络通信(三)OkHttp实现登入
  • 数据库类型介绍
  • 远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接
  • hbase mongodb hive starrocks比较
  • 专题十一——栈
  • 17种Kubernetes安全检测工具详解
  • 解决绿盟漏洞扫描 gateway、nacos、springboot tomcat检测到目标主机可能存在缓慢的HTTP拒绝服务攻击问题
  • Node基本使用
  • Linux KASLR 地址偏移
  • C语言:数组转换指针的时机
  • Sparrow系列拓展篇:对信号量应用问题的深入讨论
  • Spring Cloud OpenFeign 声明式服务调用与负载均衡组件
  • React——useReducer
  • 3D模型平台行业全面深入分析
  • 【DQ Robotics】二次规划控制
  • 金融量化交易模型的探索与发展
  • 鸿蒙系统ubuntu开发环境搭建
  • Windows VScode+Latex环境
  • 华为IPD流程管理体系L1至L5最佳实践-解读
  • 《Shader 入门精要》学习笔记 茵蒂克丝
  • //动态内存分配
  • 深度学习笔记之BERT(二)BERT精简变体:ALBERT
  • 红帽(RHCE)工程师认证