java绘制图形代码_ImagePy_Learn | 图形学绘制代码学习:core\draw\polygonfill.py

0834b543883ddb48beb01557b3a424d7.png

最近在学图形学绘制,想到了ImagePy框架的ROI涂抹交互很方便,于是啃起了绘制代码。

这里主要对ImagePy中一个填充工具进行难点讲解。

让我们好好学习Python中的图形学绘制吧。

例子代码来源:

https://github.com/Image-Py/imagepy/blob/master/imagepy/core/draw/polygonfill.py​github.com

疑问:

for i in range(len(polys)): for j in range(len(polys[i])): ys.append((i,j,polys[i][j][1])) ys = np.array(ys)

转换成一维数组还是转换成适合pandas处理的数据结构?

polys[i][j][1])代表什么?

cur = scan(polys, idx, ys[:,2], st, y, cur, buf)

一列扫描吗?

ImagePy_Learn学习系列

土盐:ImagePy_Learn | 图形学绘制代码学习:coredrawfill.py

土盐:ImagePy_Learn | 图形学绘制代码学习:paint.py

详解如下:

round((p1[0]+k*p2[0])/(1+k),4)

61324799e817ff87302a57903826cd0f.png

参考原文链接:Python round() 函数

np.sort(rs)

e65b01505ea4c723daba596715d848db.png

参考原文链接:np.sort()函数的作用 - Vaxue的博客 - CSDN博客

plg[:-1]

X[:,0]是numpy中数组的一种写法,表示对一个二维数组,取该二维数组第一维中的所有数据,第二维中取第0个数据,直观来说,X[:,0]就是取所有行的第0个数据, X[:,-1] 就是取所有行的最后一个数据。

import numpy as np
a=np.random.rand(5)
print(a)
[ 0.64061262  0.8451399   0.965673    0.89256687  0.48518743]print(a[-1]) ###取最后一个元素
[0.48518743]print(a[:-1])  ### 除了最后一个取全部
[ 0.64061262  0.8451399   0.965673    0.89256687]print(a[::-1]) ### 取从后向前(相反)的元素
[ 0.48518743  0.89256687  0.965673    0.8451399   0.64061262]print(a[2::-1]) ### 取从下标为2的元素翻转读取
[ 0.965673  0.8451399   0.64061262]

参考原文链接:python中[-1]、[:-1]、[::-1]、[n::-1]使用方法 - qq_21840201的博客 - CSDN博客

python p[:0]与p[:1]的区别

img.shape[:2]

img.shape[:2] 取彩色图片的高、宽,如果img.shape[:3] 取彩色图片的高、宽、通道

1:一般的数组如:【22,33】 shape是(2,):他表示他是一个一维数组,数组中有两个元素;注意他和shape(2,1)的区别,他两个不一样。

2:[[22],[33]] 他的shape是(2,1),表示二维数组,每行有一个元素

3:[[22,33]] shape是(1,2) 他表示一个二维数组,每行有两个元素

image.shape[0], 图片垂直尺寸
image.shape[1], 图片水平尺寸
image.shape[2], 图片通道数

参考原文链接:shape 函数,以及shape(2,)和shape(2,1)区别

区别 image.shape[0],image.shape[1],image.shape[2]

st = np.argsort(ys[:,2])

numpy.argsort(a, axis=-1, kind=’quicksort’, order=None)

功能: 将矩阵a按照axis排序,并返回排序后的下标

参数: a:输入矩阵, axis:需要排序的维度

返回值: 输出排序后的下标

71f38e0a1e9a1f613b5db8656b24313f.png

参考原文链接:numpy中实用但不常见的方法(3)np.argsort - cetrol_chen的博客 - CSDN博客

bot,top = np.clip([int(ys[:,2].min()-1),int(ys[:,2].max()+2)], 0, shape[0])

将[int(ys[:,2].min()-1),int(ys[:,2].max()+2)]范围外的数强制转化为[0, shape[0]]范围内的数

  • def clip(a, a_min, a_max, out=None): 将数组a中的所有数限定到范围a_min和a_max中,即az中所有比a_min小的数都会强制变为a_min,a中所有比a_max大的数都会强制变为a_max.
  • 其中a_mina_max可以为一个和a一样大小的数组(列表也可以,只要是类似数组的结构就是可行的),则数组中相应位置的元素进行比较。
  • out 是可选项,表示把强制截取后的结果放到这个数组中,但是out中的数组必须和a形状一样

509ae549575d5db4013a886c16395b41.png

参考原文链接:np.clip截取函数 - cloud&ken - 博客园

python中numpy模块下的np.clip()的用法 - IT届的小学生 - CSDN博客

idx = ys[:,:2].astype(np.int16)

使用方法:

  • df.astype('数据类型') #改变整个df的数据类型
  • df['列名'].astype('数据类型') #仅改变某一列的数据类型

8018d55e6902afb05b271344915329d7.png

num=num.astype('str')#将整个dataframe都转换为str类型

参考原文链接:python强制类型转换astype - weixin_42036641的博客 - CSDN博客

ys.append((i,j,polys[i][j][1]))

numpy.append(arr, values, axis=None):

简答来说,就是arr和values会重新组合成一个新的数组,做为返回值。而axis是一个可选的值

当axis无定义时,是横向加成,返回总是为一维数组!

Examples-------->>> np.append([1, 2, 3], [[4, 5, 6], [7, 8, 9]])array([1, 2, 3, 4, 5, 6, 7, 8, 9])

numpu.append(arr,values,axis=None)

将values插入到目标arr的最后。

注意,这里values跟arr应该为相同维度的向量

f6c766b6ec13b765ef7bd1edc129dc7c.png

参考原文链接:numpy的numpy.delete()/insert()/append()函数 - 开贰锤 - CSDN博客

对numpy.append()里的axis的用法详解_python_脚本之家

ys = np.array(ys)

984c68b6b9f9cee5f11cb09c993addbd.png

参考原文链接:python中数组(numpy.array)的基本操作 - fu6543210的博客 - CSDN博客

np.array(rst).T

转置函数.T,将原shape为(n,m)的数组转置为(m,n),一维数组转置不变

参考原文链接:python数据分析(3)--numpy数组形状转换.T/.reshape()/.resize() - weixin_42695959的博客 - CSDN博客

rst.extend([(x,y) for x in range(max(x1,o[0]), min(x2, shape[2]))])

1. 列表可包含任何数据类型的元素,单个列表中的元素无须全为同一类型。

2. append() 方法向列表的尾部添加一个新的元素。只接受一个参数。

3. extend()方法只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。

数组拼接方法一

思路:首先将数组转成列表,然后利用列表的拼接函数append()、extend()等进行拼接处理,最后将列表转成数组。

示例1:

>>> import numpy as np

>>> a=np.array([1,2,5])

>>> b=np.array([10,12,15])

>>> a_list=list(a)

>>> b_list=list(b)

>>> a_list.extend(b_list)

>>> a_list

[1, 2, 5, 10, 12, 15]

>>> a=np.array(a_list)

>>> a

array([ 1, 2, 5, 10, 12, 15])

该方法只适用于简单的一维数组拼接,由于转换过程很耗时间,对于大量数据的拼接一般不建议使用。

参考原文链接:numpy数组拼接方法介绍 - zyl1042635242的专栏 - CSDN博客

python中的append的用法 - m0_37870649的博客 - CSDN博客

for i in zip(rs[::2],rs[1::2])

b8b942e11f56cfa5bfcf1ad4348201ac.png

参考原文链接:Python zip() 函数 | 菜鸟教程

源码快查

# -*- coding: utf-8 -*-
"""
Created on Mon Nov 14 17:40:41 2016
@author: yxl
"""
from __future__ import absolute_import
import numpy as npdef f(p1,p2,y):if abs(p1[1]-y) > abs(p2[1]-y):p1,p2 = p2,p1k =1.0* (p1[1]-y)/(y-p2[1])return round((p1[0]+k*p2[0])/(1+k),4)def scan(polys, idx, ys, st, y, cur, buf):while cur<len(idx) and ys[st[cur]]<=y:c = idx[st[cur]]poly = polys[c[0]]for i in (c[0], (c[1]-1)%len(poly)), tuple(c):if i in buf:buf.remove(i)else: buf.append(i)cur += 1return curdef roots(polys, buf, y):rs = []for i in buf:poly = polys[i[0]]i1,i2 = i, (i[0],(i[1]+1)%len(poly))rs.append(f(poly[i1[1]], poly[i2[1]],y))return np.sort(rs)def fill(plgs, img, color = 1, o=(0,0)):polys = [np.array(plg[:-1])-0.5 for plg in plgs]shape = img.shape[:2]ys = []for i in range(len(polys)):for j in range(len(polys[i])):ys.append((i,j,polys[i][j][1]))ys = np.array(ys)st = np.argsort(ys[:,2])buf, rst, cur = [], [], 0bot,top = np.clip([int(ys[:,2].min()-1),int(ys[:,2].max()+2)], 0, shape[0])idx = ys[:,:2].astype(np.int16)for y in range(bot, top):cur = scan(polys, idx, ys[:,2], st, y, cur, buf)rs = roots(polys, buf, y)for i in zip(rs[::2],rs[1::2]):x1, x2 = int(np.ceil(i[0])), int(np.floor(i[1])+2)x1, x2 = max(x1,0), min(x2, shape[1])if x1 >= shape[1] or x2 < 0: continue#rst.extend([(x,y) for x in range(max(x1,o[0]), min(x2, shape[2]))])img[y,x1:x2] = colorreturn np.array(rst).Tif __name__ == '__main__':import matplotlib.pyplot as pltfrom time import time# pg.shape = (1,4,2)pg = np.array([[(-300,-100),(1100,100),(400,1300),(100,100)]])# img.shape = (1000, 500)img = np.zeros((1000, 500))a = time()rc= fill(pg, img)print(time() - a)plt.imshow(img, interpolation='nearest',cmap='gray')plt.show()print("Done!")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机管理中添加用户属性,如何在计算机右键菜单栏中添加属性选项

如何在计算机右键菜单栏中添加属性选项电脑是现在最常用的工具之一&#xff0c;有些用户想知道如何在计算机右键菜单栏中添加属性选项&#xff0c;接下来小编小编就给大家介绍一下具体的操作步骤。具体如下&#xff1a;1. 首先第一步按下【winr】快捷键打开【运行】窗口&#x…

青岛旅游学校计算机证书,【我和我的旅校】青岛旅游学校优秀毕业生郭千瑜

原标题&#xff1a;【我和我的旅校】青岛旅游学校优秀毕业生郭千瑜姓名&#xff1a;郭千瑜班主任&#xff1a;李欣专业&#xff1a;2012级中国民航大学航空班我是郭千瑜&#xff0c;2015年毕业于青岛旅游学校中国民航大学航空班&#xff0c;今年夏天&#xff0c;我就要从韩国首…

计算机网络同步技术,计算机网络同步技术

同步&#xff1a;通信双方的收发数据序列必须在时间上一致&#xff0c;以使接收方能准确地区分和接收发送方发来数据。同步方式&#xff1a;同步传输、异步传输。1.异步传输(起—止式同步方式)异步传输&#xff1a;发送端和接收端的时钟信号是各自独立的。特点&#xff1a;信息…

dts数据库迁移工具_干货分享丨DM8 DTS工具使用小技巧

DTS工具的介绍DM数据库为迁移提供了图形化工具——DTS。DTS可以从主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能&#xff0c;极大的简化了迁移操作&#xff0c;让数据迁移变得简单。DTS迁移步骤1.可以查看迁移帮助工具2.新建工程&#xff0c;工程名为qy…

hsv 直方图均衡化_Opencv从零开始 - 「启蒙篇」- 直方图、直方图均衡和反向投射...

本文主要介绍一些opencv关于直方图的一些知识运用&#xff0c;直方图是非常常用的图像处理方法&#xff0c;有时候在很多图像预处理中能起到特别好的效果&#xff0c;大家可以一起来学习探讨~目录直方图计算直方图直方图均衡化CLAHE 自适应均衡化2D直方图直方图反射投影直方图✏…

浙江嘉兴计算机学校排名,嘉兴计算机考研线上课程实力排名

嘉兴计算机考研线上课程实力排名冲刺分清主次现在各科的复习已经进入**后的收尾工作了&#xff0c;现在基本上就是扫除知识盲区&#xff0c;进行知识点的查缺补漏非法学法律硕士考研报考条件而且&#xff0c;妥协次就会有第二次&#xff0c;所以一开始就不要下载那些APP&#x…

b - 数据结构实验之查找二:平衡二叉树_文件系统的灵魂数据结构 B树

其实平衡二叉树的代码实现已经挺复杂的了&#xff0c;但是一山更比一山高&#xff0c;B树算法的原理和代码实现都比平衡二叉树要更为复杂。我没有让大家知难而退的意思&#xff0c;面试的时候肯定不会让你写B树这么复杂的算法&#xff0c;大家先听我讲讲B树这种数据结构的思想吧…

计算机技术如何设计酶,百人学者Nature Chemical Biology发文,发现一种设计酶的新方法...

生物通报道&#xff1a;中科院微生物研究所&#xff0c;荷兰格罗宁根大学的研究人员发表了题为“Computational redesign of enzymes for regio- and enantioselective hydroamination”的文章&#xff0c;利用计算机方法重新设计了天冬氨酸酶&#xff0c;将其转化为不对称加氢…

全国计算机二级哪几门比较热,【热】全国计算机二级office难吗

摘要&#xff1a; 【热】全国计算机二级office难吗为你介绍计算机二级office难吗 计算机二级office比较难&#xff0c;计算机二级office考试通过率大致在22%左右&#xff0c;具有一定难度。想要通过考试&#xff0c;需要多刷计算机二级office真题。 计算机二级office考试难度对…

word总页数不包含封面_6个实用的word模板,让你快速制作表格和目录

Word是我们日常办公经常用到的一款软件&#xff0c;word中自带了一些常用操作的模板&#xff0c;可以方便我们快速实现相应的需求&#xff0c;而且颜值也会提升一个档次&#xff0c;但是不过我们很多朋友都不太知道&#xff0c;今天就给大家盘点一些word中都有哪些好用的模板&a…

前端面试技巧和注意事项_前端面试百分之九十九过的技巧

2020最全的前端面试指南&#xff0c;一个多月 1.8w 字的面试经验积累&#xff0c;凭借它最终成功入职大厂……今年的金三银四刚好赶上疫情&#xff0c;很多大公司都停止招聘甚至裁员&#xff0c;想跳槽的小伙伴被打的措手不及。需求减少要求肯定随之提高&#xff0c;谨以此面经…

node获取服务器cpu信息,听说你不知道如何监控Node服务的内存?

刚开始&#xff0c;先抛出一个问题&#xff1a;你知道你们生产环境的 Node 服务平时占用内存多少吗&#xff1f;或者说是多少量级&#xff1f;山月在面试 Node 候选人时&#xff0c;这个问题足够筛掉一半的自称Node精通者&#xff0c;不过没有回答上来&#xff0c;我往往会再补…

调python返回图片_三个好习惯,帮你写好Python里的异常处理

如果你用 Python 编程&#xff0c;那么你就无法避开异常&#xff0c;因为异常在这门语言里无处不在。打个比方&#xff0c;当你在脚本执行时按 ctrlc 退出&#xff0c;解释器就会产生一个 KeyboardInterrupt 异常。而 KeyError、 ValueError、 TypeError 等更是日常编程里随处可…

如何调位置_如何知道手表是偷停还是真没动力了?看完之后你在家也能测

导读&#xff1a;石英表如果出现偷停情况&#xff0c;通常是这几个地方出现问题&#xff1a;一、线路板接触不良&#xff1b;二、电池未安装到位&#xff1b;三、电池电量不足&#xff1b;四、受力导致的电池接触不良等&#xff1b;解决方案&#xff1a;一、修复或更换线路板&a…

怎么安装aptdaemon模块_自己开发一个React Native 模块

大纲为什么需要 React Native Module如何创建一个 React Native的模块编写 Android Toast 功能模块如何调试 React Native 模块---------官方文档中未提及或者我没有找到&#xff0c;这里是我自己探索的npm 发布一个 React Native 模块&#xff08;外链接&#xff09;为什么需要…

语言ppt课件猜拳_八年级语文上册第22课 孟子三章讲解及课件下载

八年级语文上册【第一单元】八年级语文上册第1课《消息二则》讲解及PPT课件下载八年级语文上册第2课《首届诺贝尔奖颁发》讲解及PPT课件下载八年级语文上册第3课《“飞天”凌空》讲解及PPT课件下载八年级语文上册第4课《一着惊海天》讲解及PPT课件下载八年级语文上册第5课《国行…

读取txt原理_Mysql客户端任意文件读取学习

前言最近打了 DDCTF和 国赛&#xff0c;发现都考了一个知识点&#xff0c;也就是 MysqlLocalInfile客户端文件读取这个漏洞&#xff0c;下面来详细的学习一个这个漏洞。漏洞形成原因此漏洞形成的主要原因在于 LOAD DATA INFILE这个语法上。在官方文档中的介绍为&#xff1a;该L…

jar包 jdk 停_一文读懂jar包的小秘密

简介java程序员每天不是在创建jar包就是在创建jar包的路上&#xff0c;并且各种依赖引用都是以jar包的形式展示的。但是随着现代IDE的出现&#xff0c;我想很多程序员已经基本上很少直接和jar包打交道了。换句话说&#xff0c;他们已经不认识jar包了。那么jar包到底是什么呢&am…

逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门

Hello World&#xff01;我是老乔&#xff0c;欢迎来到超智星球。在这里&#xff0c;每篇都学一个小知识。微号&#xff1a;超智星球 网站:http://chaozhixingqiu.com这期呢&#xff0c;还是计算机原理系列&#xff0c;上期最后讲到了自动制表机和IBM。本期接着讲计算机历史。#…

文本标点英文对齐_电脑健盘中的所有英文组合意思超值解释建议收藏

电脑键盘上所有英文键的意思1、Esc :取消和退出键2、Tab :表格键切换键3、Caps Lock :字母大小写切换键4、Shift :转换键5、Ctrl: 控制键&#xff0c;需要配合其他键或鼠标使用&#xff0c; 例如复制CtrIC6、Alt: 可选(切换)键&#xff0c;-般与其它键组合使用&#xff0c; 例如…