图像像素的访问、通道的合并与分离
(一)像素的访问
图像在计算机里面就是一个矩阵,对于RGB图像来说,一共有3层,分别代表了RGB通道,矩阵中的每一个数字的大小代表了不同通道的亮度,范围在0-255之间。
访问图像的像素就是对矩阵元素的访问
import cv2
import numpy as np
img = cv2.imread("1.jpg", cv2.IMREAD_COLOR)
print(img[0][0][0])
输出为
205
也可以对所选取图像的像素进行赋值
for i in range(400):
for j in range(400):
for k in range(3):
img[i][j][k] = 255
这样的话图上左上角会形成一个400×400像素的白色区域
可以利用图像矩阵的特点,制作一个椒盐现象
写一个椒盐函数,将我们想要的像素随机分布在图像上
def salt(img, numbers):
for x in range(numbers):
i = np.random.randint(img.shape[0])
j = np.random.randint(img.shape[1])
for k in range(3):
img[i][j][k] = 255
return img
点上1500个点
img = salt(img, 1500)
输出显示图像为
(二)通道分离
对于RGB图像,拥有RGB三原色通道,从矩阵的角度来讲,可以理解为三层矩阵,也就是三维的矩阵,每一层代表着一个通道。将图片进行通道分离可以使用OpenCV里的split函数,也可以通过numpy库对图像矩阵进行直接操作。图像展示的是不同通道的256级灰度图。
b, g, r = cv2.split(img)
cv2.namedWindow('Blue')
cv2.imshow('Blue', b)
cv2.waitKey(0)
cv2.namedWindow('Green')
cv2.imshow('Green', g)
cv2.waitKey(0)
cv2.namedWindow('Red')
cv2.imshow('Red', r)
cv2.waitKey(0)
输出的图像为
如果要把单独保留一个通道,其他通道为0,可以这样做
b, g, r = cv2.split(img)
pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 0] = b
cv2.namedWindow('Blue')
cv2.imshow('Blue', pic)
cv2.waitKey(0)
pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 1] = g
cv2.namedWindow('Green')
cv2.imshow('Green', pic)
cv2.waitKey(0)
pic = np.zeros(np.shape(img), np.uint8)
pic[:, :, 2] = r
cv2.namedWindow('Red')
cv2.imshow('Red', pic)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出图像为
(三)通道合并
常用的方法有二
其一:
OpenCV中自带的函数megre
megre = cv2.merge([b, g, r])
其二:
numpy模块中的dstack,深度拼接函数
dstack = np.dstack([b, g, r])
但是这两种拼接方法是不同的