在这篇博客里将为你介绍如何通过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. 【转】Loading PNGs with SDL_image

    FROM:http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/index2. ...

  2. 网络爬虫第三次作业——多线程、scrapy框架

    作业①: 1)单/多线程爬取网站图片实验   要求:指定一个网站,爬取这个网站中的所有的所有图片,例如中国气象网http://www.weather.com.cn.分别使用单线程和多线程的方式爬取. ...

  3. uniapp请求方法的封装

    之前在接触uniapp做小程序项目时候,因为不太熟悉,遇到了不少尴尬的时刻,请求方法的封装算是灵魂啊有木有,今天看到有人问题,就把我自己写的发出来让大家参考一下吧. 请求方法的封装我一般用的是prom ...

  4. Codeforces 1404 D. Game of Pairs

    Codeforces 1404 D.Game of Pairs 给定\(2n\)个数\(1,2,...,2n\),A 和 B 将进行交互,规则如下: A 需要将元素分成 n 组 \(\mathbf{p ...

  5. MySQL查询这一篇就够了

    1. 条件 使用where子句对表中的数据筛选,结果为true的行会出现在结果集中 语法如下: select * from 表名 where 条件; 例: select * from students ...

  6. 通过JS判断当前浏览器的类型

    通过JS判断当前浏览器的类型,对主流浏览器Chrome.Edge.Firefox.UC浏览器.QQ浏览器.360浏览器.搜狗浏览器的userAgent属性值来判断用户使用的是什么浏览器. 不同浏览器的 ...

  7. [MIT6.006] 11. Integer Arithmetic, Karatsuba Multiplication 整型算术,Karatsuba乘法

    很多人不喜欢√2的表达,他们认为它不是一个数. 一.卡塔兰数 Catalan numbers 在数方面上,有个著名的数叫卡塔兰数 Catalan numbers,它是组合数学中一个常在各种计数问题中出 ...

  8. 基于云开发 CloudBase 搭建在线视频会议应用教程

    基于云开发 CloudBase 搭建在线视频会议应用 在线视频会议应用是基于浏览器的能力 WebRTC 以及 腾讯云开发 CloudBase 能力构建而成的应用. 在云开发的助力下, 一个复杂的在线会 ...

  9. 利用虚拟化环境虚拟nvme盘

    前情介绍 SPDK SPDK的全称为Storage Performance Development Kit ,是Intel发起的一个开源驱动项目,这个是一个开发套件,可以让应用程序在用户态去访问存储资 ...

  10. linux下内存释放

    细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法 ...