OpenCV图像基本操作讲解

admin 2024年2月9日14:36:51评论12 views字数 4839阅读16分7秒阅读模式

大家好,今天分享这篇文章主要介绍了OpenCV基本操作中的图像基础操作,

希望对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考。

‍‍读取图片

imread 功能是加载图像文件成为一个 Mat 对象。

第一个参数表示图像文件名称。
第二个参数表示加载的图像是什么类型,支持常见的三个参数值

  • IMREAD_UNCHANGED(<0) 表示加载原图,不做任何改变

  • IMREAD_GRAYSCALE(0) 表示把原图作为灰度图像加载进来

  • IMREAD_COLOR(>0) 表示把原图作为 RGB 图像加载进来

注意:OpenCV 支持 JPG、PNG、TIFF 等常见格式图像文件加载(默认读取的格式是 BGR)

import cv2# 读取图像image = cv2.imread("E:image.png")# 打印形状,类型,和具体对象print(image.shape,type(image),image)

输出结果如下:

(419, 691, 3) <class 'numpy.ndarray'> [[[ 92 103  57]  [ 87  98  52]  [ 86  98  50]  ...  [ 69  70  30]  [ 69  71  35]  [ 74  75  41]]]

可以发现这是个 numpy 数据类型的,而且是三个维度的,比如 [H,W,C]

显示图像

imread功能是显示图像。

第一个参数表示显示图像描述信息
第二个参数为imread的Mat对象。

# 获取加载原图灰度image = cv2.imread('E:image.png')# 图像的显示,也可以创建多个窗口cv2.imshow("mmimage",image)# 等待时间,毫秒级,0 表示任意键终止cv2.waitKey(0) cv2.destroyAllWindows()

OpenCV图像基本操作讲解

会出现一个弹窗,显示一张图片。

输出:(按下任意键关闭该窗口)

图片灰度化

# 获取加载原图灰度image = cv2.imread('E:image.png',cv2.IMREAD_GRAYSCALE)# 图像的显示,也可以创建多个窗口cv2.imshow("Image",image)# 等待时间,毫秒级,0 表示任意键终止cv2.waitKey(0) cv2.destroyAllWindows()

效果如下:

OpenCV图像基本操作讲解

在新弹出窗口显示一张已灰度化处理的图片。

颜色空间转换


上面提取图片灰度,也可以通过颜色空间转化函数。

cvtColor函数是进行图片颜色空间转换的

第一个参数是输入图像,通过imread读取的图像。
第二个参数是颜色空间转换的标志,支持下面几种类型:

  • COLOR_BGR2GRAY 表示BGR转换为灰度图 (Grayscale)

  • COLOR_BGR2HSV 表示把BGR颜色空间转换为HSV颜色空间

  • COLOR_BGR2RGB 表示把BGR转换为RGB

  • COLOR_GRAY2BGR 表示把灰度转换为BGR

  • COLOR_HSV2BGR 表示把HSV转换为BGR

# 图片灰度化也可以cvtColor函数,# 这样好处就是原图用于其它操作,不会影响image = cv2.imread('E:image.png')# 不同颜色空间之间进行转换,转换灰度gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 图像的显示,也可以创建多个窗口cv2.imshow("gray_image",gray_image)cv2.imshow("orgin_image",image)# 等待时间,毫秒级,0 表示任意键终止cv2.waitKey(0) cv2.destroyAllWindows()

OpenCV图像基本操作讲解

会出现两个弹窗图片,一个是原始图,一个是灰度处理后的。

裁剪部分图像数据

前面我们看到加载的图片为numpy.narray类型。这样就可以直接作为切片进行处理了。

import cv2# 读取图像image = cv2.imread('E:image.png')# 取出图像的一半cut_image = image[:image.shape[0] // 2,:image.shape[1] // 2]# 显示裁剪后的图片cv2.imshow("cut_image",cut_image)# 等待时间,毫秒级,0 表示任意键终止cv2.waitKey(0) cv2.destroyAllWindows()

效果如下:

OpenCV图像基本操作讲解

颜色通道提取

通过 cv2 的 split() 方法可以进行颜色的通道提取。

# 导入 OpenCV 库import cv2image = cv2.imread('E:image.png')# 颜色提取b,g,r = cv2.split(image)# 输出g

输出效果如下:

rray([[103,  98,  98, ..., 112, 111, 112],       [102,  97,  96, ..., 111, 111, 112],       [100,  94,  92, ..., 111, 111, 113],       ...,       [ 81,  79,  83, ...,  73,  72,  72],       [ 80,  82,  79, ...,  72,  72,  71],       [ 78,  78,  78, ...,  70,  71,  75]], dtype=uint8)

上面说过 OpenCV 默认读取的格式是 BGR.也可通过切片操作修改。

# 导入 OpenCV 库import cv2image = cv2.imread('E:image.png')# 复制图片cur_img = image.copy()# 注意参数的变化,仅保留Gcur_img[:,:,0] = 0cur_img[:,:,2] = 0# 仅保留B# cur_img[:,:,1] = 0# cur_img[:,:,2] = 0# 仅保留R# cur_img[:,:,0] = 0# cur_img[:,:,1] = 0# 输出仅有G的颜色图片cv2.imshow('G',cur_img)# 等待时间,毫秒级,0 表示任意键终止cv2.waitKey(0)cv2.destroyAllWindows()

效果如下:

OpenCV图像基本操作讲解

G 是 Green 的缩写,这里显示的是绿色。

数值计算

在前面我们讲numpy的时候讲过它有广播的功能,不消耗内存进行数值运算。

如果不了解,看一下我前面的文章《数据科学初学者必知的Python第三方库NumPy》有相应介绍。

 导入 OpenCV 库import cv2image = cv2.imread('E:image.png')# 数值运算image1 = image + 30# 过长,我就简单截取print(image[:5,:,0])print(image1[:5,:,0])cv2.imshow('cal',image1)# 等待时间,毫秒级,0 表示任意键终止cv2.waitKey(0)cv2.destroyAllWindows()

输出内容如下:

[[92 87 86 ... 72 69 70] [90 85 84 ... 71 71 70] [88 82 82 ... 73 71 70] [87 82 79 ... 73 71 70] [84 83 77 ... 73 71 70]][[122 117 116 ... 102  99 100] [120 115 114 ... 101 101 100] [118 112 112 ... 103 101 100] [117 112 109 ... 103 101 100] [114 113 107 ... 103 101 100]]

图片image1的每个值都做了+30的操作。

如果超过RGB颜色范围255的话:新颜色 = 原有颜色值 + 30 - 255

图像融合

addWeighted 函数用于将两个图像进行加权相加,生成一个新的图像。

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
  • src1:第一个输入图像。

  • alpha:第一个图像的权重。

  • src2:第二个输入图像。

  • beta:第二个图像的权重。

  • gamma:图像融合中的常量。

需要融合的两张图像,把美女放到相框中去如下:

import cv2import matplotlib.pyplot as plt # 这个库是用来画图的#这是jupyter notebook里的命令, 意思是将那些用matplotlib绘制的图显示在页面里而不是弹出一个窗口%matplotlib inline image_xk = cv2.imread('xk.jpg')image_mn = cv2.imread('mv.jpg')# 将两张图像横向拼接result = np.hstack((image_xk, image_mn))plt.imshow(result)plt.show()

OpenCV图像基本操作讲解

# 如果两个图片长宽相同才可以这么相加result = image_xk +image_mnprint(result)

说明:image_mn和image_xk的我选择的图片都是512 * 512的,所以不需要转化。

如果图片大小不同是需要做裁剪的。美女图片过大,那我们可以裁剪和相框大小的宽高。

image_mn1 = cv2.resize(image_mn,image_xk.shape)

下面是融合2张图片的代码:

# 定义权重alpha = 0.6beta = 0.4gamma = 0# 使用addWeighted函数将两个图像进行加权相加image_weight = cv2.addWeighted(image_mn, alpha, image_xk, beta, gamma)plt.imshow(image_weight)plt.show()

OpenCV图像基本操作讲解

图像保存

图像的保存非常简单,只需要使用 imwrite() 方法即可将图像保存起来:

import cv2import matplotlib.pyplot as plt # 这个库是用来画图的# 读取灰度化图像image_gray= cv2.imread("mv.jpg",cv2.IMREAD_GRAYSCALE)# 图像保存# 第一个参数是图像要保存的路径,第二个图像是要保存的图像cv2.imwrite("mn_gray.jpg",image_gray)

保存的灰度图像:

OpenCV图像基本操作讲解

数据读取-视频

VideoCapture是 OpenCV 库中用于捕获视频的类。它可以用来从视频文件、摄像头或其他类似源中捕获帧。这个类允许你以帧的形式访问视频的每个时间点,并对这些帧进行处理或分析。

在 Python 中,可以使用 cv2.VideoCapture() 创建一个 VideoCapture 对象,语法如下:

capture = cv2.VideoCapture(index or filename)
  • index: 代表要打开的摄像头的索引号,如果只有一个摄像头则为 0 或 -1。

  • filename: 代表要读取的视频文件的名称。

基本操作 一旦创建了 VideoCapture 对象,你可以使用一些方法和属性来操作视频流:

  • capture.isOpened(): 检查是否成功打开视频流。

  • capture.read(): 读取视频帧。返回一个布尔值(是否成功读取)和一个帧。

  • capture.grab(): 从视频流中抓取下一帧,但不解码。

  • capture.retrieve(): 解码并返回抓取的帧。

  • capture.release(): 释放 VideoCapture 对象占用的资源。

运行下面这段代码,有惊喜等着你呢!

import cv2# 打开摄像头capture = cv2.VideoCapture(0)# 检查摄像头是否成功打开if not capture.isOpened():    print("无法打开摄像头")while True:    # 读取一帧    ret, frame = capture.read()    # 如果成功读取帧    if ret:        # 在窗口中显示帧        cv2.imshow('Video', frame)    # 按下 'q' 键退出循环    if cv2.waitKey(1) & 0xFF == ord('q'):        break# 释放资源并关闭窗口capture.release() cv2.destroyAllWindows()
下载1:Opencv电子书
公众号后台回复:opencv,即可下载搜集的基本opencv教程电子书。
下载2:Python电子书
公众号后台回复:python,即可下载为您整理的将近100本电子书。

原文始发于微信公众号(程序员老朱):OpenCV图像基本操作讲解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月9日14:36:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   OpenCV图像基本操作讲解https://cn-sec.com/archives/2213875.html

发表评论

匿名网友 填写信息