游乐游手机版
首页/AI热点日报/热点详情

OpenCV图像基本表示方法详解

类型:热点整理2026-07-16
在OpenCV图像处理领域,所有操作本质上都是在操作像素。而想要高效地操作像素,就必须理解图像在计算机内存中的存储方式——这离不开Numpy库,尤其是numpy array。可以说,numpy array是Python图像处理的基石。下面我们从最基础的图像表示方法开始,逐步拆解像素访问、感兴趣区域(

在OpenCV图像处理领域,所有操作本质上都是在操作像素。而想要高效地操作像素,就必须理解图像在计算机内存中的存储方式——这离不开Numpy库,尤其是numpy.array。可以说,numpy.array是Python图像处理的基石。下面我们从最基础的图像表示方法开始,逐步拆解像素访问、感兴趣区域(ROI)以及通道操作等核心概念,帮助你系统掌握OpenCV图像处理的基础技能。

OpenCV之图像的基本表示方法

图像的基本表示方法

这里我们只讨论三种最常见的类型:二值图像、灰度图像和彩色图像。理解它们的存储原理是进行OpenCV图像处理的第一步。

二值图像

二值图像顾名思义,只有黑白两色。计算机中用“1”表示白色,“0”表示黑色,存储和运算非常高效。由于只需要区分两种状态,一个比特位就能完成表示,常用于图像分割与轮廓提取等场景。

灰度图像

二值图像过于“粗糙”,只有黑白两极,表达细节的能力有限。因此实际应用中更常用的是灰度图像,它将亮度划分为256个级别,数值范围[0, 255]。255代表纯白,0代表纯黑,中间数值对应不同深浅的灰色。每个像素用一个字节(8位)即可存储,恰到好处,是OpenCV图像处理中最基础的数据形式之一。

彩色图像

彩色图像比前两者丰富得多,它基于RGB色彩空间——R(红)、G(绿)、B(蓝)三个通道,每个通道同样取值[0, 255]。通常大家习惯的通道顺序是R-G-B,但OpenCV偏偏不走寻常路,它使用B-G-R顺序,即蓝色在前、绿色居中、红色最后。这一点如果不注意,后续的像素访问和通道操作很容易出错。

像素处理

像素是图像的基本构成单元,所有OpenCV图像处理操作归根结底都是对像素的访问和修改。通过位置索引可以精确锁定每个像素,这是使用numpy.array进行图像处理的核心技巧。

二值图像及灰度图像

在OpenCV中,最小数据类型是无符号8位数,因此严格来说并不存在“二值图像”这种原生数据类型。所谓的二值图像其实是通过处理得到的——用0表示黑色,255表示白色。你可以把它理解为一种特殊的灰度图像,在numpy.array中同样以二维数组形式存储。

彩色图像

RGB图像被读入OpenCV后,会按行依次将B、G、R各通道的像素值存入ndarray的列中。也就是说,一个彩色像素在数组里对应三个数值,分别代表蓝、绿、红三个颜色分量。掌握这个结构,就能高效地进行通道操作和像素级处理。

使用numpy.array访问像素

numpy.array提供了item()itemset()两个专用函数,它们经过底层优化,比直接索引要快得多,可读性也更好。在OpenCV图像处理中,能用到这两个函数时,建议优先使用,能显著提升像素访问效率。

二值图像及灰度图像

二值图像可以看作灰度图像的特例,因此这里以灰度图像为例说明。函数item()的语法是item(行, 列),直接返回该位置的像素值。修改像素值则用itemset(索引值, 新值),其中索引值是一个元组(行, 列)。这种访问方式比直接下标操作更稳定,适合大批量像素处理。

彩色图像

操作彩色图像时,item()itemset()的用法与灰度图像类似,只是需要额外指定通道。语法变为item(行, 列, 通道)itemset(三元组索引值, 新值)。注意:必须同时指定行、列和通道,只写行和列是不行的,否则会触发索引错误。

感兴趣区域(ROI)

处理图像时,我们往往只关心其中某个区域,比如人脸、车牌或物体轮廓。这个区域就叫感兴趣区域(Region of Interest, ROI)。设定ROI后,可以整体操作它——赋值、复制都很方便。例如img[200:400, 200:400]就截取了以(200,200)为左上角、大小为200×200的矩形区域。掌握ROI技术,能够大幅提升图像处理的效率和针对性。

通道操作

拆分通道

通过索引拆分
最简单的方式就是用索引直接提取。对于OpenCV中的BGR图像img

b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]

通过函数拆分
cv2.split()也能完成同样的工作,一句代码搞定:

b = cv2.split(a)[0]
g = cv2.split(a)[1]
r = cv2.split(a)[2]

两种方法本质相同,但索引方式更灵活,适合需要批量处理通道数据的场景。

通道合并

拆分是逆过程,合并则把三个单通道图像拼回彩色图。用cv2.merge()即可:

brg = cv2.merge([b, g, r])

注意合并时顺序要对应OpenCV的B-G-R,否则颜色就乱了,这也是新手最容易踩的坑。

获取图像属性

图像处理中经常需要了解图像的尺寸、类型等信息,这里介绍几个常用属性,它们都是通过numpy.array直接获取的。

  • shape:彩色图像返回(行数, 列数, 通道数),灰度和二值图像只返回(行数, 列数)。通过判断返回值长度是2还是3,就能区分灰度和彩色图像,这是图像分类的常用技巧。
  • size:返回像素总数,计算公式是行数 × 列数 × 通道数。灰度/二值图像的通道数视为1,可用于估算内存占用。
  • dtype:返回图像的数据类型,通常是uint8。注意,如果图像经过归一化处理,类型会变成float32,影响后续运算。

最后看一个实际应用——从图像中提取肤色区域:

import cv2
img = cv2.imread("lesson2.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
minHue = 5
maxHue = 170
hueMask = cv2.inRange(h, minHue, maxHue)
minSat = 25
maxSat = 166
satMask = cv2.inRange(s, minSat, maxSat)
mask = hueMask & satMask
roi = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("img", img)
cv2.imshow("ROI", roi)
cv2.waitKey()
cv2.destroyAllWindows()

这个例子将图像转到HSV色彩空间,通过色调和饱和度范围生成掩模,再与原图做按位与运算,就能把肤色部分单独提取出来。感兴趣区域的处理思路,其实万变不离其宗,掌握了ROI和通道操作,你就能灵活应对各种OpenCV图像处理任务。

来源:https://m.elecfans.com/article/2181054.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。