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一样
------------------------------------------------------------
二、计算彩色图的灰度图
计算彩色图的灰度图有几种算法,比如有取平均值、加权平均值、最大值这些算法。
平均值方式公式:
简单的理解就是,分别对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)
具体效果:
标签:gray,python,image,cv2,uint8,opencv2,shape,灰度,np 来源: https://blog.csdn.net/fripy/article/details/86658002