Python画布颜色「零基础小白必看教你在python画不同颜色的画布简单好玩」( 二 )


'''初始化画布'''import cv2import numpy as npdef init_canvas(width, height, color=(255, 255, 255)):canvas = np.ones((height, width, 3), dtype="uint8")canvas[:] = colorreturn canvascanvas = init_canvas(200, 200, color=(125, 40, 255))cv2.imshow('canvas', canvas)cv2.waitKey(0)cv2.destroyAllWindows()1234567891011121314151617复制代码效果展示:

Python画布颜色「零基础小白必看教你在python画不同颜色的画布简单好玩」

文章插图
初始化白色的画布白色的画布, 因为比较简单,而且三个通道的值都相同 。
ps: 其实灰色的图片(GRAY2BGR) , 三个通道的值都相同 。
那么我们创建一个全都是1的矩阵,然后乘上某个数值,问题是不是就解决了 。
我们需要用到np.ones 函数
# 初始化一个空画布 300×300 三通道 背景色为白色 canvas_white = np.ones((300, 300, 3), dtype="uint8")12复制代码接下来, 需要乘上一个整数,255 (你可以填入0-255的任意值)
canvas_white *= 2551复制代码这种运算称之为 全局乘法。
具体代码如下:
import cv2import numpy as npcanvas_white = np.ones((300, 300, 3), dtype="uint8")canvas_white *= 255cv2.imshow('canvas', canvas_white)cv2.waitKey(0)cv2.destroyAllWindows()1234567复制代码创建的白色画布如下:
Python画布颜色「零基础小白必看教你在python画不同颜色的画布简单好玩」

文章插图
初始化彩色的画布利用cv2的内置方法merge与split我们初始化BGR的图片canvas_white 之后将原来的图片进行通道分离,之后分别乘上BGR三个通道的整数值,然后将三个通道合并在一起 , 就得到我们想要的彩图纯色背景 。
那通道的分离我们需要用到的函数是cv2.split(img).
# 将原来的三个通道抽离出来,分别乘上各个通道的值(channel_b, channel_g, channel_r) = cv2.split(canvas)12复制代码channel_b 蓝色通道,channel_g 绿色通道,channel_r 红色通道 , 都是二维的ndarray对象 。
我们指定一种颜色,例如 color = (100, 20, 50))
注意:我们这里的颜色指的BGR格式
也就是
B -> 100G -> 20R -> 50
接下来我们分别将其乘上对应的值.
# 颜色的值与个通道的全1矩阵相乘channel_b *= color[0]channel_g *= color[1]channel_r *= color[2]1234复制代码接下来我们将三个通道重新合并,需要用到的函数是cv2.merge
cv2.merge([channel_b, channel_g, channel_r])1复制代码注意:三个通道的矩阵以list [] 的方式传入merge函数.
综合起来,就是我们的第一个初始化彩色背景的函数:
# 初始化一个彩色的画布 - cv2版本def init_canvas(width, height, color=(255, 255, 255)):canvas = np.ones((height, width, 3), dtype="uint8")# 将原来的三个通道抽离出来 ,  分别乘上各个通道的值(channel_b, channel_g, channel_r) = cv2.split(canvas)# 颜色的值与个通道的全1矩阵相乘channel_b *= color[0]channel_g *= color[1]channel_r *= color[2]# cv.merge 合并三个通道的值return cv2.merge([channel_b, channel_g, channel_r])12345678910111213复制代码具体实现代码如下:
'''初始化画布'''import cv2import numpy as np# 初始化一个彩色的画布 - cv2版本def init_canvas(width, height, color=(255, 255, 255)):canvas = np.ones((height, width, 3), dtype="uint8")# 将原来的三个通道抽离出来,分别乘上各个通道的值(channel_b, channel_g, channel_r) = cv2.split(canvas)# 颜色的值与个通道的全1矩阵相乘channel_b *= color[0]channel_g *= color[1]channel_r *= color[2]# cv.merge 合并三个通道的值return cv2.merge([channel_b, channel_g, channel_r])canvas = init_canvas(200, 200, color=(125, 100, 255))cv2.imshow('canvas', canvas)cv2.waitKey(0)cv2.destroyAllWindows()1234567891011121314151617181920212223242526复制代码运行效果:
Python画布颜色「零基础小白必看教你在python画不同颜色的画布简单好玩」

文章插图
注意:此函数使用 cv2.split 非常耗时 所以只有在需要的时候才能做到 。否则用Numpy索引 。