python(+opencv2+numpy)对彩色图像的RGB通道提取、合成、显示并计算灰度图像


一、image中RGB通道提取,直接上代码很简单

import cv2

Import sys

import numpy as np

image = cv2.imread(sys.argv[1], cv2.IMREAD_COLOR)

b = image[:, :, 0]

g = image[:, :, 1]

r = image[:, :, 2]

也可以直接用opencv的split函数

(b, g, r) = cv2.split(image)

 

上面得到r g b是一维矩阵,要是直接cv2.imshow(“b”,b)的话,显示的是一张灰度图(值为0~255),如果要显示对应的颜色通道,还需要把另外的两个通道补0,如何做呢?

(1)可以使用cv2的merge函数,比如单独显示b通道,可以这样补:

image_b = cv2.merge([b, np.zeros(b.shape, np.uint8), np.zeros(b.shape, np.uint8)])

其中np.zeros(b.shape,np.uint8)表示创建一个和b矩阵维度一样,每个数据初始值的类型为uint8并且值为0的矩阵。

(2)还可以使用numpy中提供的dstack函数来实现:

image_b = np.dstack((b, np.zeros(b.shape, np.uint8), np.zeros(b.shape, np.uint8)))

numpy提供了很多矩阵合并的计算函数。比如:

np.append()

np.concatenate()

np.stack()

np.hstack()

np.vstack()

np.dstack()

其中,concatenate()函数是基础函数,其实*stack()函数里面也是用concatenate()来实现的。这些函数具体都是什么意思呢,去网上查下吧。

我贴一段别人整理的:

--------------------------------------------------------

假设有两个数组a,b分别为:

>>> a

array([0, 1, 2],

       [3, 4, 5],

       [6, 7, 8])

>>> b = a*2

>>> b

array([ 0, 2, 4],

       [ 6, 8, 10],

       [12, 14, 16])

1、水平组合

>>> np.hstack((a,b))

array([ 0, 1, 2, 0, 2, 4],

       [ 3, 4, 5, 6, 8, 10],

       [ 6, 7, 8, 12, 14, 16])

>>> np.concatenate((a,b),axis=1)

array([ 0, 1, 2, 0, 2, 4],

       [ 3, 4, 5, 6, 8, 10],

       [ 6, 7, 8, 12, 14, 16])

2、垂直组合

>>> np.vstack((a,b))

array([ 0, 1, 2],

       [ 3, 4, 5],

       [ 6, 7, 8],

       [ 0, 2, 4],

       [ 6, 8, 10],

       [12, 14, 16])

>>> np.concatenate((a,b),axis=0)

array([ 0, 1, 2],

       [ 3, 4, 5],

       [ 6, 7, 8],

       [ 0, 2, 4],

       [ 6, 8, 10],

       [12, 14, 16])

3、深度组合:沿着纵轴方向组合

>>> np.dstack((a,b))

array([[ 0, 0],

        [ 1, 2],

        [ 2, 4],

       [ 3, 6],

        [ 4, 8],

        [ 5, 10],

       [ 6, 12],

        [ 7, 14],

        [ 8, 16]])

4、列组合column_stack()

一维数组:按列方向组合

二维数组:同hstack一样

5、行组合row_stack()

以为数组:按行方向组合

二维数组:和vstack一样

------------------------------------------------------------

 

二、计算彩色图的灰度图

opencv里面直接就有转换函数,但这里采用自定义的方法来实现,计算彩色图的灰度图有几种算法,比如有取平均值、加权平均值、最大值这些算法。

平均值方式公式:

简单的理解就是,分别对BGR各个通道的颜色值乘以0.333并相加,结果作为对应像素的灰度值。

加权方式公式:每个通道的分量的值不一定,具体取多少看个人喜欢

最大值法,忘了,估计是看RGB哪个通道的值大,就用哪个吧。

Python采用上述公式的时候,要注意了,浮点运算后,得到的矩阵数值为浮点型(float32)的,但灰度图的数值是uint8型的。这个时候asytpe函数就派上用场了,矩阵值类型转换。

具体上述获取灰度图的代码可参看如下:

gray = 0.114 * b + 0.587 * g + 0.299 * r

gray = gray.astype(np.uint8)

cv2.imshow("gray", gray)

最后把详细代码贴出来:

import cv2
import sys
import numpy as np
if __name__ == "__main__":
    if len(sys.argv) > 1:
        image = cv2.imread(sys.argv[1], cv2.IMREAD_COLOR)
        b = image[:, :, 0]
        g = image[:, :, 1]
        r = image[:, :, 2]
        #(b g r) = cv2.split(image)
    #image_b = cv2.merge([b, np.zeros(b.shape, np.uint8), np.zeros(b.shape, np.uint8)])
        image_b = np.dstack((b, np.zeros(b.shape, np.uint8), np.zeros(b.shape, np.uint8)))
        cv2.imshow("image_b", image_b)
 
        gray = 0.114 * b + 0.587 * g + 0.299 * r
        gray = gray.astype(np.uint8)
        cv2.imshow("gray", gray)
 
        cv2.imshow("image", image)
        cv2.waitKey(0)
具体效果:

你可能感兴趣的:(python,opencv2)