像素是图像构成的基本单位,像素处理时图像处理的基本操作,可以通过位置索引的形式对图像内的元素进行访问、处理。

二值图像及灰度图像

OpenCV中,最小的数据类型是无符号的8位数,即unit8

可以将二值图像理解为一种特殊的灰度图像。在OpenCV中,使用0来表示黑色,使用255表示白色。

因而,本节不讨论二值图像。

在面向Python的Opencv中,图像就是Numpy中的数组,一个灰度图就是一个二维数组,例如image[0,0]就是第0行第0列位置上的像素点(最左上角的位置)。

例题:使用Numpy库生成一个元素值都是0的二维数组,用来模拟一幅黑色图像,并对其进行访问、修改。

分析:使用Numpy库里的函数进行定义一个64X64的二维数组,初始化都是0(基于zeros函数),然后对其某一列进行修改,下面是对其中两列进行修改,将0换成255。

import cv2
import numpy as np
img = np.zeros((64, 64), dtype=np.uint8)
img2 = img
cv2.imshow('one', img)
img2[:, 3] = 255    #将第4列变为白色
img2[:, 14] = 255   #将第15列变为白色
cv2.imshow('two', img2)
cv2.waitKey()

效果:

修改像素效果

例题:读取一张灰度图,并对其进行访问和修改。

灰度图

import cv2
img = cv2.imread('mile.jpg')
img2 = cv2.imread('mile.jpg')
for i in range(10, 100):
    for j in range(80, 100):
        img[i, j] = 255
cv2.imshow('WIN1', img)
cv2.imshow('win2', img2)
cv2.waitKey()

修改像素

彩色图像

RGB模式的彩色图像在读入Opencv内进行处理,会依次去读取RGB图像的B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray中。使用image[0,0,0]即是B通道里第0第0列里的数,即B00

彩色图像示意图

需要注意的是,使用img[0,0,0]访问时各个索引值的含义:

  • 第一个索引值表示第0行
  • 第二个索引值表示第0列
  • 第三个索引值表示第0个通道(即B蓝色通道)

不同的访问方式会得到不同的结果:

  • img[0,0]访问的是第0行第0列的像素点,对于彩色图像来说,就是RGB三个颜色的组合,对于一个纯红色来说就是[0,0,255] (注意通道顺序是BGR)
  • img[0,0,0]访问的是第0行第0列第0个通道B(即蓝色通道,注意通道顺序)的像素点,返回的是一个值,在0~255之间,纯蓝色就是255
  • img[0,0,1]访问的是第0行第0列第1个通道G(即绿色通道,注意通道顺序)的像素点,返回的是一个值
  • img[0,0,2]访问的是第0行第0列第2个通道R(即红色通道,注意通道顺序)的像素点,返回的是一个值
import cv2
import numpy as np
img = np.zeros((300, 300, 3), dtype=np.uint8)
img[:, 0:100, 0] = 255    # 0~99列是蓝色,0通道
img[:, 100:200, 1] = 255  # 100~199列是绿色,1通道
img[:, 200:300, 2] = 255  # 200~299列是红色,2通道
print(img)
cv2.imshow('Myimg', img)
cv2.waitKey()

绘制的颜色

颜色与数据

例题:读取一幅彩色图像,并对其像素进行访问和修改

import cv2
img = cv2.imread('food.jpg')
img2 = cv2.imread('food.jpg')
cv2.imshow('MyFood', img2)
# 区域1
for i in range(0, 50):
    for j in range(0, 100):
        for k in range(0, 3):
            img[i, j, k] = 255  # 区域1为RGB(255,255,255)

# 区域2
for i in range(50, 100):
    for j in range(0, 100):
        img[i, j] = [128, 128, 128]  # 区域2为RGB(128,128,128)

# 区域3
for i in range(100, 150):
    for j in range(0, 100):
        img[i, j] = 0  # 区域3为RGB(0,0,0)

cv2.imshow('Taste', img)
cv2.waitKey()

修改图片的像素


素材

food

mile



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2021/OpenCV3.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏