【震惊】手把手教你用python做绘图工具(一)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【震惊】手把手教你用python做绘图工具(一),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6561字,纯文字阅读大概需要10分钟。
内容图文
![【震惊】手把手教你用python做绘图工具(一)](/upload/InfoBanner/zyjiaocheng/621/901a0b41a134442f89d41893a24fd8c8.jpg)
在这篇博客里将为你介绍如何通过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做绘图工具(一)全部内容,希望文章能够帮你解决【震惊】手把手教你用python做绘图工具(一)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。