OpenCV学习笔记3基础:图像基本操作

Posted xietx1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV学习笔记3基础:图像基本操作相关的知识,希望对你有一定的参考价值。

我们来熟悉一下 OpenCV 中对图像的基本操作,本文包括以下几个方面:

  • 访问像素值并修改
  • 获取宽、高、通道数、像素总数
  • 获取ROI
  • 拆分和合并通道
  • 改变颜色空间

1. 访问像素值并修改

直接看例子:

import cv2

img = cv2.imread('images/test.jpg')
print(img[200, 200]) # [ 29 130 108]
img[200, 200] = [255, 255, 255]
img[200, 201] = [255, 255, 255]
img[201, 200] = [255, 255, 255]
img[201, 201] = [255, 255, 255]
cv2.imshow('test', img)
cv2.waitKey(0)

我们获取了位置(200,200)处的像素值,BGR 分别是 29,130,108,接着修改了四个像素值为白色(255,255,255),结果如下:

在这里插入图片描述

2. 获取宽、高、通道数、像素总数

import cv2

# read image
img = cv2.imread('images/test.jpg', 1)

# height, width, number of channels in image
height = img.shape[0]
width = img.shape[1]
channels = img.shape[2]

print('Image Dimension    : ', img.shape)
print('Image Height       : ', height)
print('Image Width        : ', width)
print('Number of Channels : ', channels)
print('Image Size  :', img.size)

输出:

Image Dimension    :  (276, 276, 3)
Image Height       :  276
Image Width        :  276
Number of Channels :  3
Image Size  : 228528

shape 成员保存了图像的形状信息(宽、高、通道数),size 成员保存了图像的总的像素个数(宽 x 高 x 通道数)。

OpenCV Python 中图像采用 numpy.ndarry 对象存储,你也可以获取其他的一些属性。

3. 获取ROI

ROI(Region Of Interest)即感兴趣的区域。获取狗狗的脑袋:

import cv2

# read image
img = cv2.imread('images/test.jpg')

# roi
roi = img[56:176, 65:200, :]

cv2.imshow('ROI', roi)
cv2.waitKey(0)

在这里插入图片描述

当然后面我们可以用目标检测自动地找出狗狗的脑袋。

4. 拆分和合并通道

可以使用 splitmerge 函数来拆分、合并通道:

import cv2

img = cv2.imread('images/test.jpg')

b, g, r = cv2.split(img)
print(b.shape)
print(b.size)
print(type(b))

img2 = cv2.merge([b, g, r])
print(img2.shape)
print(img2.size)
print(type(img2))

输出:

(276, 276)
76176
<class 'numpy.ndarray'>
(276, 276, 3)
228528
<class 'numpy.ndarray'>

可以看到单个通道的像素数是完整图像的三分之一。splitmerge 函数比较耗时,可以使用 numpy 的索引来操作:

import numpy as np
import cv2

img = cv2.imread('images/test.jpg')

b = img[:, :, 0] # blue channel
g = img[:, :, 1] # green channel
r = img[:, :, 2] # red channel

img3 = np.dstack([b, g, r]) # stack arrays in sequence depth wise (along third axis).

cv2.imshow('merge', img3)
cv2.waitKey(0)

numpy.dstack 用于将输入的数组按深度方向(第 3 维)堆叠起来(dstack 的 d 代表 depth)。

5. 改变颜色空间

可以改变图像的颜色空间:

import cv2

img = cv2.imread('images/test.jpg')

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow('BGR to GRAY', img_gray)
cv2.waitKey(0)

在这里插入图片描述

更多颜色空间可以参考:ColorConversionCodes


References

  1. OpenCV Docs: cvtColor
  2. ColorConversionCodes

QQ交流群:点击链接加入群聊【Python练习生】532232743
我的知乎:AXin啊
公众号:请叫我AXin
在这里插入图片描述

以上是关于OpenCV学习笔记3基础:图像基本操作的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

Opencv学习笔记——基础知识

OpenCV学习笔记1基础:读取显示保存图像

OpenCV学习笔记1基础:读取显示保存图像

OpenCV学习笔记1基础:读取显示保存图像