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

    科技2022-07-10  111

    四、图像基础

    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区间内?

    Processed: 0.009, SQL: 8