摘要:本文将从OpenCV和Matplotlib两个方面介绍如何绘制直方图,这将为图像处理像素对比提供有效支撑。
本文分享自华为云社区《[Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现》,作者:eastmount。
灰度直方图是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。假设存在一幅6×6像素的图像,接着统计其1至6灰度级的出现频率,并绘制如图1所示的柱状图,其中横坐标表示灰度级,纵坐标表示灰度级出现的频率[1-2]。
如果灰度级为0-255(最小值0为黑色,最大值255为白色),同样可以绘制对应的直方图,如图2所示,左边是一幅灰度图像(Lena灰度图),右边是对应各像素点的灰度级频率。
为了让图像各灰度级的出现频数形成固定标准的形式,可以通过归一化方法对图像直方图进行处理,将待处理的原始图像转换成相应的标准形式[3]。假设变量r表示图像中像素灰度级,归一化处理后会将r限定在下述范围:
在灰度级中,r为0时表示黑色,r为1时表示白色。对于一幅给定图像,每个像素值位于[0,1]区间之内,接着计算原始图像的灰度分布,用概率密度函数P®实现。为了更好地进行数字图像处理,必须引入离散形式。在离散形式下,用rk表示离散灰度级,P(rk)代替P®,并满足公式(2)。
公式中,nk为图像中出现rk这种灰度的像素数,n是图像中像素总数,是概率论中的频数,l是灰度级总数(通常l为256级灰度)。接着在直角坐标系中做出rk和P(rk)的关系图,则成为灰度级的直方图[4]。
假设存在一幅3×3像素的图像,其像素值如公式(3)所示,则归一化直方图的步骤如下:
首先统计各灰度级对应的像素个数。用x数组统计像素点的灰度级,y数组统计具有该灰度级的像素个数。其中,灰度为1的像素共3个,灰度为2的像素共1个,灰度为3的像素共2个,灰度为4的像素共1个,灰度为5的像素共2个。
接着统计总像素个数,如公式(5)所示。
最后统计各灰度级的出现概率,通过公式(6)进行计算,其结果如下:
绘制的归一化图行如图3所示,横坐标表示图像中各个像素点的灰度级,纵坐标表示出现这个灰度级的概率。
直方图被广泛应用于计算机视觉领域,在使用边缘和颜色确定物体边界时,通过直方图能更好地选择边界阈值,进行阈值化处理。同时,直方图对物体与背景有较强对比的景物的分割特别有用,可以应用于检测视频中场景的变换及图像中的兴趣点。
首先讲解使用OpenCV库绘制直方图的方法。在OpenCV中可以使用calcHist()函数计算直方图,计算完成之后采用OpenCV中的绘图函数,如绘制矩形的rectangle()函数,绘制线段的line()函数来完成。其中,cv2.calcHist()的函数原型及常见六个参数如下:
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
接下来的代码是计算图像各灰度级的大小、形状及频数,接着调用plot()函数绘制直方图曲线。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt import matplotlib #读取图像 src = cv2.imread('lena-hd.png') #计算256灰度级的图像直方图 hist = cv2.calcHist([src], [0], None, [256], [0,255]) #输出直方图大小、形状、数量 print(hist.size) print(hist.shape) print(hist) #设置字体 matplotlib.rcParams['font.sans-serif']=['SimHei'] #显示原始图像和绘制的直方图 plt.subplot(121) plt.imshow(src, 'gray') plt.axis('off') plt.title("(a)Lena灰度图像") plt.subplot(122) plt.plot(hist, color='r') plt.xlabel("x") plt.ylabel("y") plt.title("(b)直方图曲线") plt.show()
上述代码绘制的“Lena”灰度图像所对应的直方图曲线如图4所示,图4(a)表示原图像,图4(b)表示对应的灰度直方图曲线。
同时输出直方图的大小、形状及数量,如下所示:
256 (256L, 1L) [[7.000e+00] [1.000e+00] [0.000e+00] [6.000e+00] [2.000e+00] .... [1.000e+00] [3.000e+00] [2.000e+00] [1.000e+00] [0.000e+00]]
彩色图像调用OpenCV绘制直方图的算法与灰度图像一样,只是从B、G、R三个放量分别进行计算及绘制,具体代码如下所示。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt import matplotlib #读取图像 src = cv2.imread('lena.png') #转换为RGB图像 img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) #计算直方图 histb = cv2.calcHist([src], [0], None, [256], [0,255]) histg = cv2.calcHist([src], [1], None, [256], [0,255]) histr = cv2.calcHist([src], [2], None, [256], [0,255]) #设置字体 matplotlib.rcParams['font.sans-serif']=['SimHei'] #显示原始图像和绘制的直方图 plt.subplot(121) plt.imshow(img_rgb, 'gray') plt.axis('off') plt.title("(a)Lena原始图像") plt.subplot(122) plt.plot(histb, color='b') plt.plot(histg, color='g') plt.plot(histr, color='r') plt.xlabel("x") plt.ylabel("y") plt.title("(b)直方图曲线") plt.show()
最终绘制的“Lena”彩色图像及其对应的彩色直方图曲线如图5所示,其中图5(a)表示Lena原始图像,图5(b)表示对应的彩色直方图曲线。
Matplotlib是Python强大的数据可视化工具,主要用于绘制各种2D图形。本小节Python绘制直方图主要调用matplotlib.pyplot库中hist()函数实现,它会根据数据源和像素级绘制直方图。其函数主要包括五个常用的参数,如下所示:
n, bins, patches = plt.hist(arr, bins=50, normed=1, facecolor=‘green’, alpha=0.75)
图像直方图的Python实现代码如下所示,该示例主要是通过matplotlib.pyplot库中的hist()函数绘制的。注意,读取的“lena-hd.png”图像的像素为二维数组,而hist()函数的数据源必须是一维数组,通常需要通过函数ravel()拉直图像。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #读取图像 src = cv2.imread('lena-hd.png') #绘制直方图 plt.hist(src.ravel(), 256) plt.xlabel("x") plt.ylabel("y") plt.show() #显示原始图像 cv2.imshow("src", src) cv2.waitKey(0) cv2.destroyAllWindows()
读取显示的“lena”灰度图像如图6所示。
最终的灰度直方图如图7所示,它将Lena图256级灰度和各个灰度级的频数绘制出来,其中x轴表示图像的256级灰度,y轴表示各个灰度级的频数。
如果调用下列函数,则绘制的直方图是经过标准化处理,并且颜色为绿色、透明度为0.75的直方图,如图8所示。
plt.hist(src.ravel(), bins=256, density=1, facecolor=‘green’, alpha=0.75)
彩色直方图是高维直方图的特例,它统计彩色图片RGB各分量出现的频率,即彩色概率分布信息。彩色图片的直方图和灰度直方图一样,只是分别画出三个通道的直方图,然后再进行叠加,其代码如下所示。Lena彩色原始图像如图9所示。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt #读取图像 src = cv2.imread('Lena.png') #获取BGR三个通道的像素值 b, g, r = cv2.split(src) #绘制直方图 plt.figure("Lena") #蓝色分量 plt.hist(b.ravel(), bins=256, density=1, facecolor='b', edgecolor='b', alpha=0.75) #绿色分量 plt.hist(g.ravel(), bins=256, density=1, facecolor='g', edgecolor='g', alpha=0.75) #红色分量 plt.hist(r.ravel(), bins=256, density=1, facecolor='r', edgecolor='r', alpha=0.75) plt.xlabel("x") plt.ylabel("y") plt.show() #显示原始图像 cv2.imshow("src", src) cv2.waitKey(0) cv2.destroyAllWindows()
绘制的彩色直方图如图10所示,包括红色、绿色、蓝色三种对比。
如果希望将三个颜色分量的柱状图分开绘制并进行对比,则使用下面的代码实现,调用plt.figure(figsize=(8, 6))函数绘制窗口,以及plt.subplot()函数分别绘制4个子图。
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np import matplotlib.pyplot as plt import matplotlib #读取图像 src = cv2.imread('lena.png') #转换为RGB图像 img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) #获取BGR三个通道的像素值 b, g, r = cv2.split(src) print(r,g,b) plt.figure(figsize=(8, 6)) #设置字体 matplotlib.rcParams['font.sans-serif']=['SimHei'] #原始图像 plt.subplot(221) plt.imshow(img_rgb) plt.axis('off') plt.title("(a)原图像") #绘制蓝色分量直方图 plt.subplot(222) plt.hist(b.ravel(), bins=256, density=1, facecolor='b', edgecolor='b', alpha=0.75) plt.xlabel("x") plt.ylabel("y") plt.title("(b)蓝色分量直方图") #绘制绿色分量直方图 plt.subplot(223) plt.hist(g.ravel(), bins=256, density=1, facecolor='g', edgecolor='g', alpha=0.75) plt.xlabel("x") plt.ylabel("y") plt.title("(c)绿色分量直方图") #绘制红色分量直方图 plt.subplot(224) plt.hist(r.ravel(), bins=256, density=1, facecolor='r', edgecolor='r', alpha=0.75) plt.xlabel("x") plt.ylabel("y") plt.title("(d)红色分量直方图") plt.show()
最终输出的图形如图11所示,,图11(a)表示原图像,图11(b)表示蓝色分量直方图,图11©表示绿色分量直方图,图11(d)表示红色分类直方图。
本文主要讲解图像直方图理论知识以及直方图绘制方法,并且包括Matplotlib和OpenCV两种统计及绘制方法。灰度直方图是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。这篇文章的知识点将为后续图像处理和图像运算对比提供支撑。
点击关注,第一时间了解华为云新鲜技术~
3MechanismsforscalingChubby的客户端是单独的进程,所以Chubby必须处理比人们想象中更多的客户端;我们已经看到有90,000个客户端直接与Chubby的主服务器通信,远远超过了所涉及的机器数量。因为每个单元只有一个主服务器,而且它的机器和客户端的机器是一样的,客户端可以以很大的幅度压倒主服务器。因此,最有效的扩展技术是将与主服务器的通信次数减少一个较大的系数。假设主服务器没有严重的性能缺陷,主服务器的请求处理的微小改进也没有什么效果。我们使用了几种方法:我们可以创建任意数量的Chubby单元;客户端几乎总是使用附近的单元(通过DNS找到)以避免对远程机器的依赖。我们的典型部署是在一个有几千台机器的数据中心使用一个Chubby单元。当主服务器处于heavyload时,可能会将租赁时间从默认的12秒增加到60秒左右,因此它需要处理更少的KeepAliveRPC。KeepAlives是迄今为止最主要的请求类型(见4.1),未能及时处理它们是过载服务器的典型故障模式;客户端对其他调用的延迟变化基本不敏感)。Chubby客户端对文件数据、元数据、没有文件和开放句柄进行
前言最近在尝试用某种快速姿势刷公益src,看看效率如何,刷了一个星期,快刷吐了,有些机械,但是经验值是真的非常的足,感觉一般刷个两三个星期估计就能升级了。所以各位师傅等级高的不介意尝试此副本,感觉自己少点经验升级的大侠可以去试试,本篇文章可能比较新手化,并且本人文采不怎么好,大佬轻喷。全篇的宗旨就一个字:快!正文这里我想讲述的是一个方法,非常方便而又简单快速的方法,非常的简单,所以速度全靠自己把控。这决定了在这段时间你能靠手速刷到多少经验,整篇文章采用轻松愉快的方式进行阐述,希望看的开心。第一步:寻找可访问重要域名面对公益类网站,我们单刀直入,直接访问,这时候会出现两种情况,一种是直接访问正常,如果能正常访问,第一步就已经达到目的了。另一种是无法访问,无法访问的原因可能是站点临时关闭,在平时可以去寻找他的别的资产,但是我们现在讲究一个快字,如果无法直接访问主站,马上!立刻!修改域名,尝试访问admin,oa这两个子域名,查看是否能够正常访问,如果能够正常访问,处理方案看第三步。第二步:寻找可访问后台假设成功访问主站,直接访问robots.txt,这时候又会产生两种情况,第一种是不存在4
JavaScript被设计为单线程(webWoker可以处理多线程),利用事件轮询机制,可以模拟出多线程效果,也就是异步操作,而回调函数callback是事件轮询调用的目标方法。但是,通过回调函数处理异步事件有很多不确定性,并且容易陷入“回调地狱”-嵌套太深。于是,Promise概念被提出,并且很多JavaScript框架(比如JQuery)支持的异步API都基于Promise理念构建的。1.什么是Promise?Promise是一个对象,用来传递异步操作的信息,它代表了某个未来时刻才知道结果的事件,并且这个事件提供统一API接口。2.Promise对象Promise原型对象提供的主要方法有://添加状态改变时的回调函数 Promise.prototype.then(resolvedFunc,rejectedFunc) //响应rejected状态的promise(如果前面有错误抛出,会产生一个rejected状态的promise) //相当于promise.then(null,rejectedFunc) Promise.prototype.catch(rejectedFunc)复制参
说明 什么是NB-IOT?NB-IOT模块和GPRS模块使用起来是一样的,都需要插手机卡.NB-IOT是作为移动网络的一个单独的分支.如果您的设备传输的数据量不是很大,传输速率也没有严格的要求,直接用NB-IOT模块即可.传输速度低就代表耗电少.低功耗!如果您的设备传输的数据量挺大,而且希望传输速度快,那么还是选用2G/3G/4G模块.实物图资源概括外壳(已选择配套外壳,挡板未开口加工)锂电池安放锂电池可以贴放到板子背面锂电池尺寸选择65*30*3.5mm(推荐)60*45*3.5mm(需要打磨两个插件引脚,避免刮伤电池)60*60*3.5mm(需要打磨四个插件引脚,避免刮伤电池)硬件资源介绍1.下载调试口模块LUA开发方式,串口1作为下载调试串口实际提供给用户一个下载器!警告:USB电源供电时不要使用DC电源供电!以防烧毁USB2.DC电源供电(5.5-2.1mm)3.锂电池充电供电接口默认使用DC电源供电,没有DC电源,自动切换到锂电池供电.可做备用电源或断电检测报警.4.晶体管输出(两路)晶体管输出电压为DC电源输入电压!如果用户用来控制设备,注意选择功率充足的DC电源!5.干接
RTSP协议以客户服务器方式工作,它是一个多媒体播放控制协议,用来使用户在播放从因特网下载的实时数据时能够进行控制,如:暂停/继续、后退、前进等。因此RTSP又称为“因特网录像机遥控协议”。我们的RTSP-Sever组件EasyRTSPSever就是一款比较便捷的组件。我们有开发者在测试EasyRTSPServer的时候,遇到应用程序无法启动的问题:其实我们每次发现这个问题,都很郁闷,我们先是尝试安装了VC的补丁包,装了半个小时后还是一样的提示,确实有点崩溃。后来有同事提出一款依赖库查看工具,于是我们又尝试着用这个工具(depends.exe)来进行分析。随后通过分析工具看到,ucrtbased.dll这个库怎么是X86的?程序也没有用这个库文件。我们与这位开发者沟通,他说之前安装一个什么别的软件,提示缺这个文件,他从网上下载了一个库文件放到系统目录里面,问题就在这里,正好他有64位的Windows系统,我在别的机器上拷贝了一个这个库放到程序目录下,再运行程序,果然好用。
我想所有Java程序员都曾被这个newString的问题困扰过,这是一道高频的Java面试题,但可惜的是网上众说纷纭,竟然找不到标准的答案。有人说创建了1个对象,也有人说创建了2个对象,还有人说可能创建了1个或2个对象,但谁都没有拿出干掉对方的证据,这就让我们这帮吃瓜群众们陷入了两难之中,不知道到底该信谁得。但是今天,老王就斗胆和大家聊聊这个话题,顺便再拿出点证据。以目前的情况来看,关于 newString("xxx") 创建对象个数的答案有3种:有人说创建了1个对象;有人说创建了2个对象;有人说创建了1个或2个对象。而出现多个答案的关键争议点在「字符串常量池」上,有的说new字符串的方式会在常量池创建一个字符串对象,有人说new字符串的时候并不会去字符串常量池创建对象,而是在调用intern() 方法时,才会去字符串常量池检测并创建字符串。那我们就先来说说这个「字符串常量池」。字符串常量池字符串的分配和其他的对象分配一样,需要耗费高昂的时间和空间为代价,如果需要大量频繁的创建字符串,会极大程度地影响程序的性能,因此JVM为了提高性能和减少内存开销引入了字符串常量池
将做好的前端组件制作成npm包发布一、名字animation-css二、期间发布npm包npmpublish时遇到几个报错1.报错codeE403npmERR!codeE403 npmERR!403Forbidden-PUThttps://registry.npm.taobao.org/animation-css-[no_perms]Privatemodeenable,onlyadmincanpublishthismodule npmERR!Acompletelogofthisruncanbefoundin: ......复制这个问题是我们使用了淘宝镜像的问题,使用的是淘宝源cnpm,登陆到的是cnpm,我们把它切换成npm就好了。npmconfigsetregistryhttp://registry.npmjs.org/复制如果是这种报错:npmERR!codeE403 npmERR!403Forbidden-PUThttp://registry.npmjs.org/animation-css-Packagenametoosimilartoexistingpackages .....
题目是由Winter出的,出片在这里>>Winter出的题,有些我也答不上来,题目难度并不是很高,但还考的比较深入。例如:JavaScript中的科里化、尾递归及其优化等(因为工作中用到这些的地方并不多)之前我也整理过,叫《网上收集的十道题》,那些题目,如果只是日常的页面开发,有些也许不会遇到,但如果想深入JavaScript,去研究一下也未尝不是一件好事情。我所了解的招聘前台开发人员,不同的公司以及部门对前台开发的技能要求会各有所异。打个比方:(需要熟练掌握如下技能的:切图、XHTML、CSS、JavaScript)的前端开发的公司会问:Web标准、函数式、设计模式、OO、浏览器兼容性以及hasLayout的问题,进(以JavaScript开发为主导的,平时较少需要进行页面切割)的公司,算法是一定会考的,其中编写的JavaScript脚本它的性能和优化问题,CDN、http相关也会问,但这些公司都会问同一个问题:跨域如何处理,方案有哪些,如何选择?部门、产品需要什么样的人,考察的侧重点会有所不同。但既然是写代码,基本的一些算法还是要会一点,性能优化这个也是很重要的。即使如
本月的Python资源来了,你准备好了吗?本次我们对近1000种Python文章进行了排名,以下为Top10的文章,分享给大家。本次热文的主题包括:教程,数据可视化,网络爬虫,Django,f-Strings,机器学习,Mapbox,Mapbox,Seamcarving,Matplotlib(此前发布过多篇收藏党喜欢的文章,也是来自Mybridge:①Python开源项目Top10精选,平均star为1128!②从15000个Python开源项目中精选的Top30,Github平均star为3707,赶紧收藏!③我们从8800个机器学习开源项目中精选出Top30,推荐给你④5月Python好文TOP10新鲜出炉⑤Keras、卷积神经网络、Pytorch以及音频处理优秀文章推荐⑥机器学习TOP10必读论文⑦Top50机器学习项目实战总结)▌Rank1.Python马尔可夫链初学者教程文章地址:https://www.datacamp.com/community/tutorials/markov-chains-python-tutorial▌Rank2.JakeVanderPlas-Veg
前段时间无聊装了个VS2010RC,然后试着建个了WPF的工程,体验了一番.刚开始没觉得这东西比WinForms方便在哪,只是觉得它是一套跟Win32/MFC/WinForms完全不同的的东西.Win32/MFC/WinForms只要了解了消息循环机制,理解起来就比较容易,可WPF冒似没这套东西.而且,HWND已经不存在于控件上了,这是一个令人很不习惯的地方.要知道不论什么UI库,要想跟DirectX一起使用的话,必须有一个HWND来指定绘制区域.那么问题就来了:怎么用WPF做一个DX的编辑工具?最早看到过的方式是WPF提供的D3DImage类.这个类的作用就是把BackBuffer拷贝过来,然后再用WPF那一套东西来显示.这样的好处就是可以跟WPF的排版/Alpha融合什么的无缝结合,但是,由于中间多了一个拷贝,会影响一部分效率.再者,D3D9在XP和Vista上的处理方式不一样.还有一个更麻烦的事:WPF是基于D3D9的,这就意味着GL/DX10/DX11就不能直接利用这种方式来整合.所以呢,还是要通过HWND的传统方式来.因为绘制区域的半透明/变形之类的特性,对于一个工具来说,完
括号配对问题-题目链接描述现在,有一行括号序列,请你检查这行括号是否配对。输入第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No样例输入3 [(]) (]) ([[]()])复制样例输出No No Yes复制解析顺序扫描括号字符串中每一个字符,当遇到栈空或者遇到左括号时该括号进栈;当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,出栈继续判断;若当前栈顶元素与当前扫描的右括号括号不匹配,则将该右括号进栈(此时已经匹配失败);若最终栈为空,则括号匹配成功,如果不为空,则不成功;代码实现#include<iostream> #include<stack> #include<
字符编码我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。因此,Unicode
packagecom.sanqing.util; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; publicclassDBConnection{ privatestaticfinalStringDBDRIVER="com.mysql.jdbc.Driver"; //驱动类类名 privatestaticfinalStringDBURL="jdbc:mysql://127.0.0.1:3306/javaweb_test";//连接URL privatestaticfinalStringDBUSER="username"; //数据库用户名 privatestaticfinalStringDBPASSWORD=
终于结束了最后css3的一节课,关于animation的使用,其实之前已经用过一次。大致要了解的就是,关于如何让动画停在最后一帧的方法。视频里有提到过css3出了个新的样式可以实现,但是老师没有记住,用了个变通的方法,就是单独设置一个 .stop{left:0!important;top:0!important;} 然后在js里将这个class赋值给元素即可。 后来我又网上找了一下,发现其实是一个叫animation-fill-mode的样式,将它的值设置为forwards,就可以实现效果。 另:关于animation还有一些疑惑,最疑惑的在于,js,jq还有css3既然都能实现动画,到底哪个性能最好呢?我还要去调查一下,以后再写吧。 <style> #wrap{ width:400px; height:400px; border:1pxsolidblack; position:relative; margin:10pxauto; } #box{ width:100px; height:100px; position:absolute; background
本文引用自: http://hbasefly.com/2017/11/19/timeseries-database-2/ 作者对时序数据库有很多的研究,其博客发表有多篇相关文章。 本人最近在学习时序数据库相关,因此此处摘抄时序数据库文档。 时序数据库技术体系中一个非常重要的技术点是时序数据模型设计,不同的时序系统有不同的设计模式,不同的设计模式对时序数据的读写性能、数据压缩效率等各个方面都有不同程度的影响。这篇文章笔者将会分别针对OpenTSDB、Druid、InfluxDB以及Beringei这四个时序系统中的时序数据模型设计进行介绍。 在详细介绍时序数据模型之前,还是有必要简单回顾一下时序数据的几个基本概念,如下图所示: 上图是一个典型的时序数据示意图,由图中可以看出,时序数据由两个维度坐标来表示,横坐标表示时间轴,随着时间的不断流逝,数据也会源源不断地吐出来;和横坐标不同,纵坐标由两种元素构成,分别是数据源和metric,数据源由一系列的标签(tag,也称为维度)唯一表示,图中数据源是一个广告数据源,这个数据源由publisher、adve
传送门 好久没写题解了,就过来水两篇。 对于每一个人,考虑一个序列$A$,$A_I$表示当k取值为i时的答案。 如果说有两个人,我们可以把$(A+B)^k$二项式展开,这样就发现把两个人合并起来的操作就是一次卷积,直接NTT就可以了。 同类人有多个,直接暴力肯定是不行的。快速幂的话不知道会不会T,我是用了多项式取ln和exp(拉板子)。 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #defineMN400002 usingnamespacestd; intread_p,read_ca; inlineintread(){ read_p=0;read_ca=getchar(); while(read_ca<'0'||read_ca>'9')read_ca=getchar(); while(read_ca>='0'&&read_ca<='9')read_p=read_p*10+read_ca
前序遍历+判断 /** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(intx){val=x;} *} */ classSolution{ intres=0; //List<String>res=newLinkedList<>(); publicintsumNumbers(TreeNoderoot){ if(root==null)return0; preOrder(root,""); //for(inti=0;i<res.size();i++) //System.out.print(res.get(i)+""); returnres; } publicvoidpreOrder(TreeNoderoot,Stringtmp){ if(root==null)return; tmp+=root.val+""; if(root.left==null&&root.right==null){
有了default_server,小张心里松了一口气,不用担心server_name写错而白跑一趟了。但是要是Nginx没有设置default_server呢? 老王:”如果没有设置,那么我们入口初开始,根据端口号8888找到的第一个就是默认default_server“。 _代表无效的域名,不会与任何真实的server_name相交。”“匹配没有传递Host头信息的请求。 server{ server_name""; #Listport listen9999; location/{ return200$hostname; } } 复制 返回结果:192.168.0.102,个人的ip地址。 还可以多个域名,ip,当然无法使用server_name来匹配所有的名称,这是刚才讲过的listen的属性。 server{ listen80; server_namewyc.com www.wyc.com "" 192.168.1.1 ; ... } 复制 原来还有这么多种方式,那么正则也讲讲吧。 表示区分大小写的匹配,表示不区分大小写的匹配正则表达式以^开始,$结束。点.代表除换行符以外的任
1.改变列的长度 db2"altertable[tablename]altercolumn[columnname]setdatatypevarchar(length)"2.在表中加列 db2"altertable[tablename]add[columnname] varchar(256)"3.修改列名 a.添加新列 db2"altertable[tablename]add[columnname] varchar(256)" b.把旧列的数据更新到新列 update[tablename]set新列=旧列 c.删除新列 db2"alter table [tablename] drop column [columnname] ALTERTABLE<table_name>ALTER
man/help功能说明:帮助手册举例:查看ls命令的使用方法:manls;ls--help ls功能说明:列出目录内容举例:列出/var目录的文件和目录的信息:ls-l/var;最常用方式ls–ltr cd功能说明:切换目录举例:切换到根目录:cd/返回上一级目录:cd..返回上两级目录:cd../..进入个人的主目录:cd~ mkdir功能说明:创建目录举例:创建test目录:mkdirtest rmdir 功能说明:删除一个空目录 举例:删除test目录,rmdirtest。rmdir-ptest1/test2-p表示连同子目录一起删除 touch功能说明:创建一个空文件举例:创建一个空的test.txt文件:touchtest.txt cat功能说明:查看小文件内容举例:查看test.txt文件内容:cattest.txt并且显示行号:cat-ntest.txt往文件中添加内容(如果文件不存在,会创建文件):cat>test.txt tac 功能说明:反向显示文档内容,由最后一行到第一行反向在屏幕上显示出来,cat和tac相反 chmod功能说明:修改文件或目录权限。举例