《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三色通道的提取与合并–超详细解读