OpenCV笔记之四——图像基础操作

2020/10/05 08:04
阅读数 19

四、图像基础

1、像素

a. 什么是像素?

像素是构成图像的基本要素。

在灰度图中,每一个像素值都是位于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)

b. 坐标系

像素坐标系:纵轴为x(row),横轴为y(colomn),这与我们熟知的空间坐标系不同,容易混淆,需要细细区分。

注意:Python语言的索引从0开始。

2、像素操作

老规矩,还是先放一段源代码。

a. 源代码展现

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)
b. 代码解释

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"的窗口呈现。

3、查看运行结果

Pixel at (0, 0) - Red: 254, Green: 254, Blue: 254
Pixel at (0, 0) - Red: 255, Green: 0, Blue: 0

结果显示了刚刚我们要求打印的修改前和修改后的像素点RGB以及三幅图像。

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
“Original” “Corner” “Updated”

仔细观察,发现名为"Corner"的窗口中,图像左上角的一个小点变成了红色(就是我们修改的位置为[0, 0]的像素)。

4、关于Numpy

a. Why Numpy?

虽然Python自带了创建数组的功能,但采用Numpy会使我们的代码计算效率大大提高。

b. Numpy的数组切片

Numpy的数组切片为无复制切片,当对切片进行赋值操作时,原数组的数值也会发生变化,那么该如何将数组中的部分数据完全复制到一个新数组呢?

浅拷贝与深拷贝

浅拷贝:Numpy里的切片类似于C语言里的指针,属于浅拷贝。

x2_sub = x2([:2, :3])

深拷贝:完全复制数组内容,对新数组的内容进行更改不会影响原数组。

x2_sub_copy = x2([:2, :3]).copy( )
Python中的深拷贝
import copy

zs = copy.deepcopy(xs)

思考题

如何将从0-1000的亮度等级线性变换到任意的A~B区间内?

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部