第三章 Opencv图像像素操作

时间:2023-02-10 17:53:12

1.像素

1.像素是构成数字图像的最小单位。每一幅图像都是由M行N列个像素组成,每一个像素存储一个像素值。比如:灰度图像的像素值取值范围为[0, 255](取整),一共有256个像素等级/灰度级别。0为纯黑色,255表示纯白色。

2.一个像素是一个具有一定面积的块,而不是一个点;像素的形状也不是固定的,大多数情况下被认为是正方形,但有时也可能是圆形或其它形状。

1-1.确定像素位置

由电脑自带的画图软件打开图片可查看图片水平方向和垂直方向的像素数量。如下图所示,水平方向像素个数303,垂直方向像素个数266。

第三章 Opencv图像像素操作

像素的位置通常使用像素建立的HW坐标系表示,如下图所示。

注意:

1.水平像素个数是303,但水平坐标是从0到302;同理,垂直坐标从0到265。你可以这样理解像素的左上角坐标=像素的位置坐标

2.像素坐标表示为(垂直方向坐标W, 水平方向坐标H),与我们以前学习xy坐标系中坐标表示(x, y)相反。

第三章 Opencv图像像素操作

1-2.获取指定像素的像素值

第三章 Opencv图像像素操作

1.一般来说,彩色图片采用的都是RGB色彩空间,在RGB色彩空间中存在三个通道。R通道、G通道和B通道,其中R通道指的是红色通道,G通道指的是绿色通道,B通道指的是蓝色通道,并且每个色彩通道都是在区间0~255内取值。

2.在RGB色彩空间中,彩色图像的通道顺序是 R → G → B,但是在OpenCV中,RGB色彩空间被BGR色彩空间取代,使得彩色图像的通道顺序变成了 B → G → R 。所以,上图读取到的各通道值为B(204)→ G(208)→ R(209)。

3.BGR色彩空间的图像,每3个数值表示一个像素,这三个数值分别表示蓝色,绿色和红色三种颜色的分量,把每一种颜色分量所在的区域称作通道。即 RGB/BGR 色彩空间的图像,用R、G、B 3个数值表示一个像素

1-3.修改像素的BGR值

  • 方式1:像素赋值;img[W, H] = [B, G, R]

    • 实例:

      第三章 Opencv图像像素操作

  • 方式2:通道赋值;img[W, H,0或1或2] = 0~255中的某个整数

    • 实例:

      第三章 Opencv图像像素操作

1.对于BGR色彩空间的图像,当每个像素的B、G、R 3个数值相等时,就可以得到灰度图像。其中,B=G=R=0为纯黑色,B=G=R=255为纯白色。

2.要想使改变后的像素保存到图片中,最后要执行imwrite()方法。

2.用numpy模块操作像素

关于numpy的知识以后再更新,也可以去网上搜索,这里主要讲关于opencv的。

2-1.创建图像

在opencv中,黑白图像实际上就是一个二维数组,彩色图像是一个三维数组。数组中的每个元素就是图像对应位置的像素值。因此,修改数组就是修改图像的像素(即修改图像)。所以,创建一张图像其实就是创建一个数组

1.创建黑白图像

  • 创建黑色图像:使用numpy提供的zeros()方法。

    • 实例:

      第三章 Opencv图像像素操作

  • 创建白色图像:法1.先创建纯黑图像,再利用numpy的数组切片将所有像素值改为255;法2.使用numpy的ones()方法,再用数组乘法乘以255.

    • 实例:

      第三章 Opencv图像像素操作

      第三章 Opencv图像像素操作

2.创建彩色图像

  • 与创建黑白图像的方法相比,彩色图像创建时:a.size多了个通道数(为3);b.数组切片多了一个维度;c.数组乘法没区别

    • 实例:

      第三章 Opencv图像像素操作

3.创建随机图像

第三章 Opencv图像像素操作

1.numpy的zeros()方法第一个位置参数就是size,所以可以用位置参数;而randint()方法的第二个位置参数不是size,所以要用关键字参数。

2.综上,numpy创建图像的方法主要有:①numpy创建数组的内置方法;②numpy的数组乘法;③numpy的数组切片。

2-2.拼接图像

numpy提供了两种数组拼接的方法,分别为hstack()方法和vstack()方法。(h:horizontal水平的意思,v:vertical垂直的意思;stack:堆、叠的意思)

1.水平拼接hstack()方法

  • 语法格式:array = numpy.hstack(tup)

  • 参数说明:

    • array:拼接生成的新数组。
    • tup:需要拼接的数组;元组类型。
  • 实例:

    第三章 Opencv图像像素操作

2.垂直拼接vstack()方法

  • 语法格式:array = numpy.vstack(tup)

  • 参数说明:

    • array:拼接生成的新数组。
    • tup:需要拼接的数组;元组类型。
  • 实例:

    第三章 Opencv图像像素操作

注意拼接是有顺序的,是根据参数tup中的数组顺序拼接的。