小强学Python+OpenCV之-1.2图像基础

本文介绍了图像的基础知识,包括像素的概念、图像的坐标系统、像素的RGB值操作及使用numpy进行图像处理的方法。通过实际代码示例展示了如何利用Python和OpenCV修改像素值和提取图像区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小强学Python+OpenCV之-1.2图像基础

目标

学完本节,我们将理解:
1. 图像的基本元素是像素,什么是像素。
2. 图像的坐标系统是怎样的。
3. 操作像素的RGB值
4. 通过numpy数组操作图像

1. 什么是像素

像素是组成图像的最小单位。我们可以看下面这张图:
这里写图片描述

我们常常像下面这样表述一幅图像的大小。
300 x 200大小。这里的300和200便是指的像素。一幅300 x 200的图像表示有300*200=6万个像素。

通常,像素的值我们称之为强度。这里可能要引入一个概念-“通道”才会比较好理解一点。
而图像通常会用两种方式表示:灰度图像和彩色图像。

灰度图像指的是,每个像素的值为一个8位无符号数表示的值,范围是:0-255.也就是说,灰度图像只是用一个通道来表示像素的强度。如下面的图所示:
这里写图片描述

而彩色图像是由三个8位(也有可能是16位,32位等)无符号数表示的值。什么?我没听错吧。三个数会表示成什么样子?没错,三个数表示成一个numpy数组(相当于一维数组)。三个数分别取不同的值(0-255),就可以表示出总共16777216种颜色。
这里写图片描述

对于三原色RGB的描述,可参考:RGB color model

坐标系统

假设我们有一幅5*5的图像,那么它的坐标是这样的:
这里写图片描述

坐标系的原点在图像的左上角,像素(1,3)表示第1列第3行的像素(注意,这里是从0开始索引的)。

操作像素

我们已经知道了图像的坐标系统。那么,我们来尝试去对像素做一些修改,看看会发生什么。
创建python脚本文件pixel_modify.py。加入内容如下:

# 导入库
import argparse
import cv2

# 构建参数解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# 加载图像并显示
image = cv2.imread(args["image"])
cv2.imshow("Original", image)

# 修改原点(左上角)像素值并显示,为了防止肉眼不好辨别,我们把左上角5*5个像素值同时作修改
image[0:5, 0:5] = (0, 0, 255)
cv2.imshow("Color1", image)
image[0:5, 0:5] = (0, 255, 0)
cv2.imshow("Color2", image)
image[0:5, 0:5] = (255, 0, 0)
cv2.imshow("Color3", image)

cv2.waitKey(0)

执行:

python pixel_modify.py

可以看到如下图:
这里写图片描述

(0,0,255)得到的是红色。
(0,255,0)得到的是绿色。
(255,0,0)得到的是蓝色。
从这里,我们可以看到,OpenCV中,对于图像三通道的值保存顺序是:BGR而不是我们习惯的RGB。这一点一定要记住。

提取图像

其实,在上面的代码中,我们在修改图像左上角像素值时,已经用到的numpy的切片功能来实现对于图像的操作。下面我们再做一个实验,巩固一下。修改代码如下:

# 导入库
import argparse
import cv2

# 构建参数解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# 加载图像并显示
image = cv2.imread(args["image"])
cv2.imshow("Original", image)

# 计算图像的中心点
(h, w) = image.shape[:2]
(cX, cY) = (w / 2, h / 2)

# 将图像平均分成四部分并显示
tl = image[0:cY, 0:cX]
tr = image[0:cY, cX:w]
br = image[cY:h, cX:w]
bl = image[cY:h, 0:cX]
cv2.imshow("Top-Left Corner", tl)
cv2.imshow("Top-Right Corner", tr)
cv2.imshow("Bottom-Right Corner", br)
cv2.imshow("Bottom-Left Corner", bl)

cv2.waitKey(0)

执行脚本,得到如下显示:
这里写图片描述

OK。至此,我们知道了:
1. 像素是组成图像的最小单位,有灰度(单通道)和彩色图像(三通道)的区别。
2. 图像的坐标系原点位于图像的左上角,区别于笛卡尔坐标系的左下角。
3. OpenCV中对于彩色图像的三通道值保存顺序是BGR,而不是RGB。一定要牢记。
4. 对于图像的操作其实就是对表示图像的numpy数组的操作。要熟悉numpy(或python中的list和tuple)操作。可参考:廖雪峰Python教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值