在这篇博客里将为你介绍如何通过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. 惊呆了!Spring Boot 还能开启远程调试?

    持续原创输出,点击上方蓝字关注我 目录 前言 什么是远程调试? 为什么要远程调试? 什么是JPDA? 如何开启调试? transport server suspend address onthrow ...

  2. 硬核!15张图解Redis为什么这么快

    作为一名服务端工程师,工作中你肯定和 Redis 打过交道.Redis 为什么快,这点想必你也知道,至少为了面试也做过准备.很多人知道 Redis 快仅仅因为它是基于内存实现的,对于其它原因倒是模棱两 ...

  3. Linux系统搭建Hadoop集群

    一.环境说明 IP地址 主机名 备注 操作系统 192.168.92.11 hserver1 namenode Ubuntu 16.04 192.168.92.12 hserver2 datanode ...

  4. STM32入门系列-库目录及文件介绍

    已经介绍了过了CMSIS标准,ST公司按照这个标准设计了一套基于STM32F10x的固件库,我们可以直接在ST公司的官网进行下载,现在给大家STM32最新固件库v3.5,在网盘上给大家提供了下载包,链 ...

  5. React中useLayoutEffect和useEffect的区别

    重点: 1.二者函数签名相同,调用方式是一致的 2. 怎么简单进行选择: 无脑选择useEffect,除非运行效果和你预期的不一致再试试useLayoutEffect 区别详解:useEffect是异 ...

  6. Java集合(类)框架(二)

    1.Set集合 1.1 HashSet集合 HashSet底层为哈希码 不是数组,因此没有下标的概念,也就不能根据下标来查询某个元素 存放元素无序,不可重复 1.1.1 声明 Set<Strin ...

  7. Docker(10)- docker create 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 创建一个新的容器但不启动它 ...

  8. NOIP 2012 P1081 开车旅行

    倍增 这道题最难的应该是预处理... 首先用$set$从后往前预处理出每一个点海拔差绝对值得最大值和次大值 因为当前城市的下标只能变大,对于点$i$,在$set$中二分找出与其值最接近的下标 然后再$ ...

  9. How to: Debug X++ Code Running in .NET Business Connector [AX 2012]

    This topic has not yet been rated - Rate this topic  http://msdn.microsoft.com/EN-US/library/bb19006 ...

  10. JS中的Array之方法(3) -之迭代

    colors=["red", "橘色", "瓜皮色", "古铜色", "#aaa", "# ...