像素是构成图像的基本要素。
在灰度图中,每一个像素值都是位于0–255中的整数。数值越小,像素越暗;数值越大,像素的亮度也越大。数值为0则代表黑色,数值为255则代表白色。在灰度图中,往往只需要一个字节来储存每一个像素点。
在彩色图中,每个像素都以RGB的形式呈现。红、绿、蓝分别占据一个字节的空间,因此每个像素占据3字节的存储空间,通常以元组的形式表示。如:
Black(黑色) : (0, 0, 255) White(白色) : (255, 255, 255) Red(红色) : (255, 0, 0)
Green(绿色) : (0, 255, 0) Blue(蓝色) : (0, 0, 255) Aqua(浅绿色) : (0, 255, 255)
Fuchsia(紫红色) : (255, 0, 255) Maroon(褐红色) : (128, 0, 0) Navy(藏青色) : (0, 0, 128)
Olive(橄榄绿) : (128, 128, 0) Purple(紫红色) : (128, 0, 128) Teal(深青色) : (0, 128, 128)
Yellow(黄色) : (255, 255, 0)
像素坐标系:纵轴为x(row),横轴为y(colomn),这与我们熟知的空间坐标系不同,容易混淆,需要细细区分。
注意:Python语言的索引从0开始。
老规矩,还是先放一段源代码。
getting_and_setting.py
(From Practical Python and OpenCV, 3rd Edition)
from __future__ import print_function 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) (b, g, r) = image[0, 0] print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b)) image[0, 0] = (0, 0, 255) (b, g, r) = image[0, 0] print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b)) corner = image[0:100, 0:100] cv2.imshow("Corner", corner) image[0:100, 0:100] = (0, 255, 0) cv2.imshow("Updated", image) cv2.waitKey(0)Line 1-9
相信没什么好解释的,导入所需的包并且解析命令行参数,忘了的可以回顾一下上节课的笔记O(∩_∩)O~ Line 10
cv2.imshow("Original", image)同样是通过图像读取函数imread加载图片,设定窗口显示名称为"Original"。 Line 11-12
(b, g, r) = image[0, 0] print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b))存储图像中最左上角像素点的RGB并将其通过format函数打印输出。
【注意因为存储图像时将其转换成了Numpy数组,其中像素的颜色以BGR的形式存储。】 Line 14-16
image[0, 0] = (0, 0, 255) (b, g, r) = image[0, 0] print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b))更改第一个像素点的颜色为红色并重新打印。 Line 18-19
corner = image[0:100, 0:100] cv2.imshow("Corner", corner)截取原图像左上角100行100列的像素点并以"Corner"的名称显示为一个独立的图像窗口。 Line 21-24
image[0:100, 0:100] = (0, 255, 0) cv2.imshow("Updated", image) cv2.waitKey(0)将原图像左上角的100*100个像素点全部变成绿色,并将更新后的图像以名称为"Updated"的窗口呈现。
结果显示了刚刚我们要求打印的修改前和修改后的像素点RGB以及三幅图像。
“Original”“Corner”“Updated”仔细观察,发现名为"Corner"的窗口中,图像左上角的一个小点变成了红色(就是我们修改的位置为[0, 0]的像素)。
虽然Python自带了创建数组的功能,但采用Numpy会使我们的代码计算效率大大提高。
Numpy的数组切片为无复制切片,当对切片进行赋值操作时,原数组的数值也会发生变化,那么该如何将数组中的部分数据完全复制到一个新数组呢?
浅拷贝:Numpy里的切片类似于C语言里的指针,属于浅拷贝。
x2_sub = x2([:2, :3])深拷贝:完全复制数组内容,对新数组的内容进行更改不会影响原数组。
x2_sub_copy = x2([:2, :3]).copy( )如何将从0-1000的亮度等级线性变换到任意的A~B区间内?