图像处理基础

numpy 访问图像

Numpy.array库是Python处理图像的基础。

在OpenCV中,通道的顺序是B→G→R

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

可以使用image[0,0]访问图像image第0行第0列位置上的像素点

先行后列: img[行,列]

使用Numpy库中的函数zeros()可以生成一个元素值都是0的数组,并可以直接使用数组的索引对其进行访问、修改。

img=np.zeros((8,8), dtype=np.uint8)

RGB模式的彩色图像在读入OpenCV内进行处理时,会按照行方向依次读取该RGB图像的B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray的列中。

在OpenCV内以BGR模式的三维数组形式存储

opencv图像处理基础(python)_二值图像

可以使用表达式访问数组内的值。

例如,可以使用image[0,0,0]访问图像image的B通道内的第0行第0列上的像素点,式中:

● 第1个索引表示第0行。

● 第2个索引表示第0列。

第3个索引表示第0个颜色通道。


绿色通道值 : green[:, :,1]=255


item()和itemset()

使用numpy.array访问像素

numpy.array提供了item()和itemset()函数来访问和修改像素值

函数item()能够更加高效地访问图像的像素点,该函数的语法格式为:

item(行,列)

函数itemset()可以用来修改像素值,其语法格式为:

itemset(索引值,新值)
import cv2
import numpy as np

//使用Numpy中的random.randint可以生成一个随机数组
img = np.random.randint(10,99,size=[5,5],dtype=np.uint8)
value = img.item(3,2)
img.itemset((3,2),255)
print(value)
print(img)

函数item()访问RGB模式图像的像素值时,其语法格式为:

item(行,列,通道)

函数itemset()修改(设置)RGB模式图像的像素值时,其语法格式为:

itemset(三元组索引值,新值)


需要注意,针对RGB图像的访问,必须同时指定行、列以及行列索引(通道),例如img.item(a, b, c)。

仅仅指定行和列是不可以的。


感兴趣区域

ROI: Region of Interest, ROI

将一个感兴趣区域A赋值给变量B后,可以将该变量B赋值给另外一个区域C,从而达到在区域C内复制区域A的目的。

opencv图像处理基础(python)_OpenCV_02


获取右侧的ROI: img[200:400,600:800] 先行后列


通道操作

Opencv中通道是按B->G->R的顺序存储的。

通道拆分

  • 通过索引拆分
b = img[ : , : , 0 ]
g = img[ : , : , 1 ]
r = img[ : , : , 2 ]
  • 通过函数拆分
b, g, r=cv2.split(img)

b=cv2.split(a)[0]
g=cv2.split(a)[1]
r=cv2.split(a)[2]

通道合并

bgr=cv2.merge([b, g, r])

获取图像属性

  • shape
    如果是彩色图像,则返回包含行数、列数、通道数的数组
    如果是二值图像或者灰度图像,则仅返回行数和列数。
  • size
    返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。
  • dtype
    返回图像的数据类型
print("图像的属性")
print(img.shape)
print(img.size)
print(img.dtype)

----------------------
图像的属性
(5, 5)
25
uint8

例子

import cv2
import numpy as np

img = np.random.randint(10,99,size=[5,5,3],dtype=np.uint8)
value = img.item(3,2,0)
img.itemset((3,2,0),255)

print("-----------")
print("img")
print(img)

print("-----------")
print("split")
b,g,r = cv2.split(img)
print("b")
print(b)
print("g")
print(g)
print("r")
print(r)
print("-----------")
print("merge")
img_m = cv2.merge([b,g,r])
print(img_m)
print("-----------")

print("图像的属性")
print(img.shape)
print(img.size)
print(img.dtype)