python简单绘图软件_【震惊】手把手教你用python做绘图工具(一)

在这篇博客里将为你介绍如何通过numpy和cv2进行结和去创建画布,包括空白画布、白色画布和彩色画布。创建画布是制作绘图工具的前提,有了画布我们就可以在画布上尽情的挥洒自己的艺术细胞。

还在为如何去绘图烦恼的小伙伴赶紧看过来,这里手把手教你解决问题~~~~

当然还是讲究一下规则:先点赞再看,尊重一下作者。年轻人还是要讲点武德的。。。

废话不多说,进入正题→→→

1.创建空白画布

定义一个函数传入图像的宽度、高度和画布的颜色,空白画布颜色传入的RGB值为(255,255,255),具体函数如下:

def InitCanvas(width, height, color=(255, 255, 255)):

canvas = np.ones((height, width, 3), dtype="uint8")

canvas[:] = color

return canvas

例如:在这个空白的画布上创建500*500颜色为纯黑色的画布,可表示为:

canvas = InitCanvas(500, 500, color=(0,0,0))

实现完整代码如下:

'''

初始化画布

'''

import cv2

import numpy as np

def InitCanvas(width, height, color=(255, 255, 255)):

canvas = np.ones((height, width, 3), dtype="uint8")

canvas[:] = color

return canvas

canvas = InitCanvas(500, 500, color=(0, 0, 0))

cv2.imshow('canvas', canvas)

cv2.waitKey(0)

cv2.destroyAllWindows()

可能有些人不能理解话不要创建原理,下面进行讲解:

1、创建一个画布本质上就是创建一个同等规格的 numpy 的 ndarray 对象;

2、创建一个新的特定尺寸的 ndarray 可以使用 np.zeors 函数, 我们将图像的高度(height), 图像的宽度(width)以及图像的通道数channel 以tuple 类型传入np.zeros 。 再次声明是tuple类型

3、另外由于不是所有的numpy类型的数值都可以放到opencv中进行图像处理,所以数值取值范围在0-255, 需要指定数据类型为uint8 unsigned integer 8-bit

具体实现:

np.zeros((height, width, channels), dtype="uint8")

2.初始化白色的画布

方法一

在创建的空白画布的颜色修改为(255,255,255),即可得到白色的画布,具体代码如下:

import cv2

import numpy as np

def InitCanvas(width, height, color=(255, 255, 255)):

canvas = np.ones((height, width, 3), dtype="uint8")

canvas[:] = color

return canvas

canvas = InitCanvas(500, 500, color=(255, 255, 255))

cv2.imshow('canvas', canvas)

cv2.waitKey(0)

cv2.destroyAllWindows()

方法二

首先想到的是白色,又因为比较简单,三个通道的值都相同。

ps: 其实灰色的图片(GRAY2BGR), 三个通道的值都相同.

那么我们创建一个全都是1的矩阵,然后,乘上某个数值,问题是不是就解决了。

我们需要用到np.ones 函数

# 初始化一个空画布 500×500 三通道 背景色为白色

canvas = np.ones((500, 500, 3), dtype="uint8")

接下来, 需要乘上一个整数255 (你可以填入0-255的任意值)

canvas_white *= 255

完整实现代码如下,结果和方法一一样:

import cv2

import numpy as np

canvas = np.ones((500, 500, 3), dtype="uint8")

canvas *= 255

cv2.imshow('canvas', canvas)

cv2.waitKey(0)

cv2.destroyAllWindows()

3. 初始化彩色的画布

3.1 利用cv2的内置方法merge与split

我们初始化BGR的图片canvas之后将原来的图片进行通道分离,分别乘上BGR三个通道的整数值,然后将三个通道合并在一起,就得到我们想要的彩图纯色背景。

那通道的分离需要用到的函数是cv2.split(img),具体用法如下:

# 将原来的三个通道抽离出来, 分别乘上各个通道的值

(channel_b, channel_g, channel_r) = cv2.split(canvas)

channel_b 蓝色通道

channel_g 绿色通道

channel_r 红色通道

都是二维的ndarray对象

我们指定一种颜色, 例如 color = (140, 30, 60))

注意, 我们这里的颜色指的BGR格式

也就是

B -> 140

G -> 30

R -> 60

接下来分别将其乘上对应的值

# 颜色的值与个通道的全1矩阵相乘

channel_b *= color[0]

channel_g *= color[1]

channel_r *= color[2]

接下来我们将三个通道重新合并,需要用到的函数是cv2.merge,具体用法如下:

cv2.merge([channel_b, channel_g, channel_r])

注意:三个通道的矩阵以list [] 的方式传入merge函数.

综合以上初始化彩色背景的函数可表示为:

'''

初始化画布

'''

import cv2

import numpy as np

# 初始化一个彩色的画布 - cv2版本

def InitCanvas(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 = InitCanvas(500, 500, color=(140, 30,60))

cv2.imshow('canvas', canvas)

cv2.waitKey(0)

cv2.destroyAllWindows()

canvas = InitCanvas(500, 500, color=(140, 30,60)) 里面的color可以自己自定义0-255之间的值。

3.2 利用numpy内置的索引

以上的方法创建起来非常的耗时,对于追求完美的小伙伴们可能不会去使用这种方法。那么来了,还有另外一种方法:

使用numpy原生的方法性能会比opencv中的要好。

可以直接使用numpy的ndarray的索引的方法。

例如 : canvas[:,:,0] 选中的是所有行和所有列像素元素的第一个值,也就是, 所有B通道的值. 然后对其进行赋值:

canvas[:,:,0] = color[0]

具体使用如图:

完整使用的代码如下:

'''

初始化画布

'''

import cv2

import numpy as np

def InitCanvas(width, height, color=(255, 255, 255)):

canvas = np.ones((height, width, 3), dtype="uint8")

# Blue

canvas[:,:,0] = color[0]

# Green

canvas[:,:,1] = color[1]

# Red

canvas[:,:,2] = color[2]

return canvas

canvas = InitCanvas(500, 500, color=(125, 50, 255))

cv2.imshow('canvas', canvas)

cv2.waitKey(0)

cv2.destroyAllWindows()

4. 综合实验-初始化背景

在这个综合实验里会创建黑色背景、白色背景、彩色背景。

'''

初始化一个空白的画布

并指定画布的颜色

'''

import cv2

import numpy as np

# 初始化一个空画布 500×500 三通道 背景色为黑色

canvas_black = np.zeros((500, 500, 3), dtype="uint8")

cv2.imshow("canvas_black", canvas_black)

# 初始化一个空画布 500×500 三通道 背景色为白色

canvas_white = np.ones((500, 500, 3), dtype="uint8")

canvas_white *= 255

cv2.imshow("canvas_white", canvas_white)

'''

初始化一个彩色的画布 - cv2版本

'''

def InitCanvasV1(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])

'''

初始化一个彩色的画布 - numpy版本

使用numpy的索引 赋值

'''

def InitCanvasV2(width, height, color=(255, 255, 255)):

canvas = np.ones((height, width, 3), dtype="uint8")

# Blue

canvas[:,:,0] = color[0]

# Green

canvas[:,:,1] = color[1]

# Red

canvas[:,:,2] = color[2]

return canvas

'''

初始化终极版本

'''

def InitCanvasV3(width, height, color=(255, 255, 255)):

canvas = np.ones((height, width, 3), dtype="uint8")

canvas[:] = color

return canvas

# 初始化一个彩色的画布

canvas_color = InitCanvasV2(500, 500, color=(100, 20, 50))

cv2.imshow("canvas_color", canvas_color)

# 等待e键按下 关闭所有窗口

while cv2.waitKey(0) != ord('e'):

continue

cv2.destroyAllWindows()

资源传送门

关注【做一个柔情的程序猿】公众号

在【做一个柔情的程序猿】公众号后台回复 【python资料】【2020秋招】 即可获取相应的惊喜哦!

「❤️ 感谢大家」

点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)

欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值