在这篇博客里将为你介绍如何通过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秋招】 即可获取相应的惊喜哦!

「️ 感谢大家」

  • 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
  • 欢迎在留言区与我分享你的想法,也欢迎你在留言区记录你的思考过程

【震惊】手把手教你用python做绘图工具(一)的更多相关文章

  1. 手把手教你吧Python应用到实际开发 不再空谈悟法☝☝☝

    手把手教你吧Python应用到实际开发 不再空谈悟法☝☝☝ 想用python做机器学习吗,是不是在为从哪开始挠头?这里我假定你是新手,这篇文章里咱们一起用Python完成第一个机器学习项目.我会手把手 ...

  2. 手把手教你吧Python应用到实际开发 不再空谈悟法✍✍✍

    手把手教你吧Python应用到实际开发 不再空谈悟法 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问 ...

  3. 手把手教你把Python应用到实际开发 不再空谈语法

    手把手教你把Python应用到实际开发 不再空谈语法 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问 ...

  4. 手把手教你使用Python爬取西刺代理数据(下篇)

    /1 前言/ 前几天小编发布了手把手教你使用Python爬取西次代理数据(上篇),木有赶上车的小伙伴,可以戳进去看看.今天小编带大家进行网页结构的分析以及网页数据的提取,具体步骤如下. /2 首页分析 ...

  5. 12岁的少年教你用Python做小游戏

    首页 资讯 文章 频道 资源 小组 相亲 登录 注册       首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...

  6. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...

  7. 手把手教你用C#做疫情传播仿真

    手把手教你用C#做疫情传播仿真 在上篇文章中,我介绍了用C#做的疫情传播仿真程序的使用和配置,演示了其运行效果,但没有着重讲其中的代码. 今天我将抽丝剥茧,手把手分析程序的架构,以及妙趣横生的细节. ...

  8. 手把手教你用Python抓取AWS的日志(CloudTrail)数据

    数据时代,利用数据做决策是大数据的核心价值. 本文手把手,教你使用python进行AWS的CloudTrail配置,进行日志抓取.进行数据分析,发现数据价值! 如今是云的时代,许多公司都把自己的IT架 ...

  9. 手把手教你用FineBI做数据可视化

    前些日子公司引进了帆软商业智能FineBI,在接受了简单的培训后,发现这款商业智能软件用作可视分析只用一个词形容的话,那就是“轻盈灵动”!界面简洁.操作流畅,几个步骤就可以创建分析,获得想要的效果.此 ...

随机推荐

  1. MVC IIS 403.14

    描述:HTTP Error 403.14 - Forbidden The Web server is configured to not list the contents of this direc ...

  2. 震惊!你还不知道SpringBoot真正的启动引导类

    引言 SpringBoot项目中的启动类,一般都是XXApplication,例如「StatsApplication」,「UnionApplication」. 每个项目的启动类名称都不一样.但是它的启 ...

  3. Java学习的第四十四天

    1.例5.4将二维数组的行列互换 public class cjava { public static void main(String []args) { int [][]a=new int [][ ...

  4. jupyter IPthon常用命令

    Jupyter IPython 一.安装Anaconda 到官网下载Anaconda安装包 双击Anaconda3-5.0.0-Windows-x86_64.exe文件 会出现如下的页面 1. 点击i ...

  5. ajax传值出现乱码问题

    第一种:前台传值到后台,浏览器控制台打印正常,controller接收后成了乱码. 后台controller层加上两行转换代码 name=URLDecoder.decode(name,"ut ...

  6. ros启动节点Error: package 'chapter2_tutorials' not found问题

    在学习ROS时,实现节点之间的通信时,参考ROS机器人高效编程,每次启动节点的时候 $ rosrun chapter2_tutorials example1_a 都会提示 Error: package ...

  7. leetcode21 surrounded regions

    题目描述 现在有一个仅包含'X'和'O'的二维板,请捕获所有的被'X'包围的区域 捕获一个被包围区域的方法是将被包围区域中的所有'O'变成'X' 例如 X X X X↵X O O X↵X X O X↵ ...

  8. B/S图书管理系统

    B/S图书管理系统 系统管理 ①新用户注册 ②用户信息修改:修改信息,修改密码 ③锁定用户 ④注销用户 书籍管理 ①新书入库 ②借书办理 ③还书办理 ④书记注销 个人管理 ①图书查询 ②借书单查询 ③ ...

  9. Pytest学习(六) - conftest.py结合接口自动化的举例使用

    一.conftest.py作用 可以理解成存放fixture的配置文件 二.conftest.py配置fixture注意事项 pytest会默认读取conftest.py里面的所有fixture co ...

  10. 有了Cloud Alert电话报警,再也不怕遗漏告警了

    Cloud Alert 的部分应用部署在阿里云上,使用了多方面的监控服务: 阿里自身的ECS服务器和网站. Zabbix 监控服务器应用程序. OneAPM 的应用级监控. 腾讯云拨测,做网站监控. ...