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

目标

学完本节,我们将理解:

  1. 图像的基本元素是像素,什么是像素。
  2. 图像的坐标系统是怎样的。
  3. 操作像素的RGB值
  4. 通过numpy数组操作图像

1. 什么是像素

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

小强学Python+OpenCV之-1.2图像基础_第1张图片
Pixel-example.png

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

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

灰度图像指的是,每个像素的值为一个8位无符号数表示的值,范围是:0-255.也就是说,灰度图像只是用一个通道来表示像素的强度。如下面的图所示:
![Uploading image_coor_594914.png . . .]

无标题.png

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


小强学Python+OpenCV之-1.2图像基础_第2张图片
RGB_color_solid_cube.png

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

坐标系统

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

小强学Python+OpenCV之-1.2图像基础_第3张图片
image.png

坐标系的原点在图像的左上角,像素(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
可以看到如下图:

小强学Python+OpenCV之-1.2图像基础_第4张图片

(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)

执行脚本,得到如下显示:

小强学Python+OpenCV之-1.2图像基础_第5张图片
image.png

OK。至此,我们知道了:

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

你可能感兴趣的:(小强学Python+OpenCV之-1.2图像基础)