Python下OpenCv的学习(二)图像像素的访问、通道的合并与分离

图像像素的访问、通道的合并与分离

(一)像素的访问

图像在计算机里面就是一个矩阵,对于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])

但是这两种拼接方法是不同的