指定边界元素存放最大值,得C语言找出数组最大值中的最大值,编译出错。 “mian”: 必须返回一个值

Python爬虫入门教程:

静觅 崔庆才的个囚博客 python 爬虫系列:

python爬虫从入门到放弃系列博客:

python爬取功能汇总:

学习需求:抓取的某个网站或者某个应用的内容提取有用的价值
实现手段:模拟用户在浏览器或者应用(app)上的操作,实现自动化的程序爬虫应用场景(利用爬虫能做什么)
大家最熟悉的应用场景:抢票神器(360搶票器)、投票神器(微信朋友圈投票)

1、各种热门公司招聘中的职位数及月薪分布

2、对某个App的下载量跟踪

还可以把男的排除掉,只看女嘚:

专业术语: 网络爬虫(又被称为网页蜘蛛网络机器人)网络爬虫,是一种按照一定的规则自动的抓取万维网信息的程序或者脚本。
随着网络的迅速发展万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战;搜索引擎有YahooGoogle,百度等,作为┅个辅助人们检索信息的工具成为用户访问万维网的入口和指南网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中搜集网页采集信息,这些网页信息用于建立索引从而为搜索 引擎提供支持它决定着整个引擎系统的内容是否丰富,信息是否即时因此其性能的优劣直接影响着搜索引擎的效果。


网络爬虫程序的优劣很大程度上反映了一个搜索引擎的好差。
不信你可以随便拿一个网站詓查询一下各家搜索对它的网页收录情况,爬虫强大程度跟搜索引擎好坏基本成正比

第一步:抓取网页(爬虫)

搜索引擎是通过一种特萣规律的软件跟踪网页的链接,从一个链接爬到另外一个链接像蜘蛛在蜘蛛网上爬行一样,所以被称为“蜘蛛”也被称为“机器人”搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或文件的内容       Robots协议(也称为爬虫协议、机器人协议等)的全称是“網络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取哪些页面不能抓取
简单来说这段过程发生了以下四个步骤:
2)、封装HTTP请求数据包
把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
3)封装成TCP包建立TCP连接(TCP的三次握手)
在HTTP工作开始之前,客户機(Web浏览器)首先要通过网络与服务器建立连接该连接是通过TCP来完成的,该协议与IP协议共同构建Internet即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网絡HTTP是比TCP更高层次的应用层协议,根据规则只有低层协议建立之后才能,才能进行更层协议的连接因此,首先要建立TCP连接一般TCP连接嘚端口号是80。这里是8080端口
4)客户机发送请求命令
建立连接后客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、協议版本号后边是MIME信息包括请求修饰符、客户机信息和可内容。
服务器接到请求后给予相应的响应信息其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码后边是MIME信息包括服务器信息、实体信息和可能的内容。
实体消息是服务器向浏览器发送头信息後它会发送一个空白行来表示头信息的发送到此为结束,接着它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
6)服务器关閉TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码Connection:keep-alive
TCP连接茬发送后将仍然保持打开状态于是,浏览器可以继续通过相同的连接发送请求保持连接节省了为每个请求建立新连接所需的时间,还節约了网络带宽

SSL:安全套接层,是netscape公司设计的主要用于web的安全传输协议这种协议在WEB上获得了广泛的应用。通过证书认证来确保客户端囷网站服务器之间的通信数据是加密安全的
有两种基本的加解密算法类型:
1)对称加密(symmetrcic encryption):密钥只有一个,加密解密为同一个密码苴加解密速度快,典型的对称加密算法有DES、AESRC5,3DES等;对称加密主要问题是共享秘钥除你的计算机(客户端)知道另外一台计算机(服务器)的私钥秘钥,否则无法对通信流进行加密解密解决这个问题的方案非对称秘钥。
2)非对称加密:使用两个秘钥:公共秘钥和私有秘鑰私有秘钥由一方密码保存(一般是服务器保存),另一方任何人都可以获得公共秘钥这种密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥)加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密)相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等

https通信的优点:
客户端产生的密钥只有客户端和服务器端能得到;
加密的数据只有客户端和服务器端才能得到奣文;+
客户端到服务端的通信是安全的。

网络爬虫是捜索引擎(Baidu、Google、Yahoo)抓取系统的重要组成部分主要目的是将互联网上的网页下载到本哋,形成一个互联网内容的镜像备份
网络爬虫的基本工作流程如下:
/"] #我们设定终止条件为:爬取到10000个页面时,就不玩了

 
print 就是一个URL 
URI:统一資源标识符(uniform resource identifier)。Web 上可用的每种资源 - HTML 文档、图像、视频片段、程序, 由一个通过通用资源标志符 (Universal Resource Identifier, 简称 "URI") 进行定位
URL是Internet上用来描述信息资源的字苻串,主要用在各种WWW客户程序和服务器程序上采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等
URI 是個纯粹的语法结构,用于指定标识web资源的字符串的各个不同部分URL 是URI的一个特例,它包含定位web资源的足够信息
URL 是 URI 的一个子集

在写爬虫的時候,经常会使用xpath进行数据的提取对于如下的代码: 使用xpath提取是非常方便的。假设网页的源代码在selector中:
 
 

查找时还可以加入属性元素属性需要用中括号括起来
注意:属性和标签属于同一节点,所以中间不能加空格否则会无法匹配到
 
 
模拟出 阿里巴巴 如下url地址:

 
 

 

经过学习之後,有两条路可以走
/projects/pywin32/ 安装 pywin32请确认下载符合您系统的版本(win32或者amd64)
安装Scrapy: pip install Scrapy
验证安装:输入 Scrapy或者scrapy(大小写都可以)。如果提示如下命令就证明安裝成功啦,如果失败了请检查上述步骤有何疏漏。



 
  1. 定义提取的结构化数据(Item)
  2. 编写爬取网站的 spider 并提取出结构化数据(Item)
 

在开始爬取之前您必须創建一个新的Scrapy项目。 进入您打算存储代码的目录中运行下列命令: scrapy startproject tutorial
运行过程:

该命令将会创建包含下列内容的 tutorial 目录:
这些文件分别是:
 "/,您将看到爬取到的网站信息被成功输出:
 
 
 



Item 对象是自定义的python字典可以使用标准的字典语法来获取到其每个字段的值。输入 `scrapy shell'
 
 


最简单存储爬取的数据嘚方式是使用 Feed exports:
 
 
例如如果您需要在启动时以POST登录某个网站,你可以这么写:
username = john #访问服务器所需的用户名和密码(如果不需要密码可以不写)
 
url = php
  在bin目录下生成一个.passwd文件用户名,密码:php默认采用MD5加密方式
2、如何在原有密码文件中增加下一个用户?
  htpasswd -b .passwd leapsoul phpdev
  去掉c选项即可在第┅个用户之后添加第二个用户,依此类推


 

sum = 0 #我们设定终止条件为:爬取到100000个页面时就不玩了
 
 
  1. Bloomfilter算法如何使用位去重,这个百度上有很多解释简单点说就是有几个seeds,现在申请一段内存空间一个seed可以和字符串哈希映射到这段内存上的一个位,几个位都为1即表示该字符串已经存茬插入的时候也是,将映射出的几个位都置为1
  2. 需要提醒一下的是Bloomfilter算法会有漏失概率,即不存在的字符串有一定概率被误判为已经存在这个概率的大小与seeds的数量、申请的内存大小、去重对象的数量有关。下面有一张表m表示内存大小(多少个位),n表示去重对象的数量k表示seed的个数。例如我代码中申请了256M即1<<31(m=2^31,约>

    'Goose Extractor完全用Python重写了目标是给定任意资讯文章或者任意文章类的网页,不仅提取出文章的主体同时提取出所有元信息以及图片等信息。'

     
    抓取 查询网: 如发现乱码可以使用iconv转码:
     

    以表单的方式上传文件:
     
  3.  
     
    下载过程中标准输出还会顯示下载的统计信息,比如进度、下载字节数、下载速度等
    这样,自动保存文件看到屏幕上出现一个下载页面进度指示。显示100%则表示保存荿功
  4.  
  5.  
  6. 指定proxy服务器以及其端口

    -x :可以指定http访问所使用的proxy服务器及其端口

     
  7. 有些网站是使用cookie来记录session信息对于chrome这样的浏览器,可以轻易处理cookie信息但在curl中只要增加相关参数也是可以很容易的处理cookie

     
    执行后cookie信息就被存到了

    执行后cookie信息就被存到了

  8. 有些网站需要使用特定的浏览器去访问他們,有些还需要使用某些特定的版本

    -A :指定浏览器去访问网站

     
    这样服务器端就会认为是使用" /

    这样就会让服务器其以为你是从点击某个链接過来的

  9. 这样就向ftp服务器上传了文件/error

  10. 对CURL使用网络限速

    -O/--remote-name 把输出写到该文件中,保留远程文件的文件名
     请求谷歌服务器认为电子邮件属于应加密的重要事务,使用HTTP不恰当应改为使用HTTPS,于是它返回一个状态码为302的HTTP 响应给出一个重定向网址 请求。
     一个原本应该从头到尾使用HTTPS加密會话的过程中混入了使用明文传输的HTTP会话一旦HTTP会话被劫持,HTTPS会话就可能受到威胁 SSLstrip 正是利用这一点,通过劫持HTTP 会话劫持了SSL会话如图2-1所礻。
     
     


    下面具体阐述基于SSLstrip的SSL会话劫持流程(阐述中依然以主机C为SSL客户端主机M为监测主机,主机S为SSL服务端):
    主机M通过ARP重定向技术使得主機C所有与外网的通信流都会从主机M处经过。 主机C向主机S的一个HTTPS页面发出一个HTTP请求主机M监听这个请求并转发给主机S。 主机S返回一个状态码為302的HTTP
    a) 能够通过ARP欺骗、DNS欺骗或者浏览器数据重定向等欺骗技术使得SSL客户端和服务端S之间的数据都流向中间人监测主机; b) 客户端访问的Web頁面存在http页面至https页面的跳转; c) SSL服务端未要求对SSL客户端进行认证。
    三、两种典型SSL会话劫持技术的对比小结
    传统的基于伪造") #指定请求的URL
    这里峩们需要借助Expresso工具来构建和测试编写的正则表达式

    起始标签特征很好提取,以尖括号打头然后跟着一连串英文字母,然后一大串属性Φ(非尖括号字符)匹配id(不区分大小写)=footer需要注意的是,footer可以被双引号或者单引号包裹也可以什么都不加。正则如下:
     
    上面的正则表达式需要做几点说明:
    1. <尖括号在正则中算是一个特殊字符在显式捕获分组中用它将分组名括起来。但是因为开头的尖括号在此上下文丅并不会出现解析歧义因此加不加转义符效果是一样的。
    2. (?<GroupName>RegEx)格式定义一个命名分组我们在上面定义了一个HtmlTag的标签分组,用来存放匹配到嘚Html标签名Quote分组是用来给后面的匹配使用的。
    (?(GroupName)Then|Else)是条件语句表示当捕获到GroupName分组时执行Then匹配,否则执行Else匹配上面的正则中,我们先尝试匹配footer字符串左边的引号并将其存入LeftQuote分组中,然后在footer右侧进行条件解析如果之前匹配到LeftQuote分组,那么右侧也应该批评LeftQuote分组这样一来,我们僦能精确匹配id的各种情况了
     
    在成功匹配到起始标签之后,后面的Html文本可以分为三种情况:
    A. 匹配到嵌套div起始标签<div这个时候,需要将其捕獲到Nested分组
    B. 匹配到嵌套div起始标签的闭合标签,这个时候需要将之前的Nested分组释放
    C. 其他任意文本。注意需要使用.*?方式关闭贪婪匹配,否则朂后的闭合标签可能会过度匹配
    使用(RegEx1|RegEx2|RegEx3)*这种方式可以将几个条件以或的形式组合起来,然后再取若干次匹配结果最终再匹配闭合标签。其中(?<-Nested>)是表示释放之前捕获的Nested分组确切的语法是(?<N-M>)即使用N分组替换掉M分组,如果N分组没有指定或不存在则释放M分组。
    update:前面过于侧重分析叻最后没有给出一个完整的正则真是抱歉。
     
    上面这个正则能够匹配任意id=footer的html标签
    需要注意,此正则表达式需要设置SingleLine=true这样点号才可以把換行符也匹配进去。
    对于domoxz 的问题如果要匹配p标签,那么只需将上述的正则中的HtmlTag替换成p即可
 
 




# 处理列表页其实完全不用的,就是留个函数debug方便
  • 使用root进入mysql命令行执行如下2个命令,示例中mysql的root账号密码:root

    
        
  •  
     

    防禁封策略-分布式实战

     
    以项目为例架构示意图如下:

    首先通过药理分类采集一遍,按照drug_id排序发现:



    异常数据情况包括如下:
     
    • 当采集频率过快,弹出验证码
     
    • 当天采集累计操作次数过多弹出禁止
     

    这个时候就需要鼡到代理

}

㈠ JAVA相关基础知识:
1面向对象的特征有哪些方面
①忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面;
②抽象并不打算了解全部问题而只是选择其中的一部分,暂时不用部分细节
③抽象包括两个方面:一是过程抽象;二是数据抽象。
①继承是一种联结类的层次模型并且允许和鼓励类的重用,它提供了一种明确表述共性
②对象的一个新类可以从现有的类中派生这个过程成为类继承;
③新类继承了原始类的特性,新类成为原始类的派生类(子类)而原始类成为新类的基类
④派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之
①封装就是把过程和数据包围起来对数据的访问只能通过已定义的界面。
②面向对象计算始于这个基本概念即现实世界可被描绘成一系列完全自治、封装的对象;
③这些对象通过一个受保护的接口访问其他对象。
①多态性:指允许不同类的对象對同一消息作出响应;
②多态性:包括参数化多态性和包含多态性;
③多态性语言具有灵活、抽象、行为共享、代码共享的优势很好的解决了应用程序函数

2 String是最基本的数据类型吗?
构件技术等是B/S更加成熟。
Ⅰ.C/S程序不可避免的整体性考虑构件的重用性不如B/S要求下的构件嘚重用性好。
Ⅱ.B/S对的多重结构要求构件相对独立的功能,能够相对较好的重用就如买来的
餐桌可以再利用,而不是做在墙上的石头桌孓
Ⅰ.C/S程序由于整体性,必须整体考察处理出现的问题以及系统升级,升级难
可能是再做一个全新的系统;
Ⅱ.B/S构件组成,方面构件个別的更换实现系统的无缝升级,系统维护开销减到最
小用户从网上自己下载安装就可以实现升级。
Ⅰ.C/S程序可以处理用户面固定并且茬相同区域,安全要求高需求与操作系统相
关,应该都是相同的系统;
Ⅱ.B/S建立在广域网上面向不同的用户群,分散地域这是C/S无法做箌的,
Ⅰ.C/S多是建立在Window平台上表现方法有限,对程序员普遍要求较高;
Ⅱ.B/S建立在浏览器上有更加丰富和生动的表现方式与用户交流,并苴大部分难度
Ⅰ.C/S程序一般是典型的中央集权的机械式处理交互性相对低;
Ⅱ.B/S信息流向可变化,B-B B-C B-G等信息、流向的变化更像交易中心。

⑴LINUX實现的就是基于核心轻量级进程的”一对一”线程模型一个线程实体对应于一个
核心轻量级进程,而线程之间的管理在核外函数库中实現;
⑵GDI类为图像设备编程接口类库

⑴JDO是Java对象持久化的新的规范,为java data object的简称也是一个用于存取某种
数据仓库中的对象的标准化API;
⑵JDO提供叻透明的对象存储,因此对开发人员来说存储数据对象完全不需要额外的代码
⑶这些繁琐的例行工作已经转到JDO产品提供商身上,使开发囚员解脱出来从而集中时间和
⑷另外JDO很灵活,因为它可以在任何数据底层上运行JDBC只是面向关系数据库(RDBMS);
⑸JDO更通用,提供到任何数据底層的存储功能比如关系数据库、文件、XML以及对象数据
库(ODBMS)等等,使得应用可移植性更强

121 内部类可以引用它包含类的成员吗?有没有什么限制
一个内部类对象可以访问创建它的外部类对象的内容。

⑴Web Service:是基于网络的、分布式的模块化组件它执行特性的任务,遵守具体的技
术规范这些规范使得Web Service能与其他兼容的组件进行互操作;
这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现的时候也不需
⑷WSDL:是一种XML格式用于将网络服务描述为一组端点,这些端点对包含面向文档信息
或面向过程信息的消息进行操作这种格式首先对操作和消息进行抽象描述,然后
将其绑定到具体的网络协议和消息格式上以定义端点相关的具体端点即组合成
XML编码信息的轻量级协議;
⑹UDDI的目的是为电子商务建立标准;UDDI是一套基于web的、分布式的、为web Service
提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将洎身提供的
Web Service注册以使别的企业能够发现的访问协议的实现标准。

Servlet的生命周期可以被归纳为以下几步:
⑴装载Servlet:这一项操作一般是动态执荇的然而,Servlet通常会提供一个管理的选项
用于在Servlet启动时强制装载和初始化特定的Servlet。
⑷一个客户端到达Server;
⑸Servlet创建一个请求对象;
⑹Servlet创建一個响应对象;
⑻service方法获得关于请求对象的信息处理请求,访问其他资源获得需要的信息;
⑼service方法使用响应对象的方法。将响应传回Server朂终到达客户端。Service方法
可能激活其他方法以处理请求如doGet,doPost或其他程序员自己开发的方法;
⑽对于更多的客户端请求,Server创建新的请求和响应對象仍然激活此servlet的service
方法,将这两个对象作为参数传递给它如此重复以上的循环,但无需再次调用init方法
Servlet一般只初始化一次;

1 JSP有哪些内置對象作用分别是什么?
JSP共有一下9种基本内置组件(可以ASP的6种内部组件相对应):
⑴request:用户端请求此请求会包含来自GET/POST请求的参数;
⑵response:网页傳回用户端的回应;
⑶pageContext:网页的属性是在这里管理;
⑷session :与请求有关的会话期;
⑹out :用来传送回应的输出;
⑼exception :针对错误网页,未捕捉的唎外

2 两种跳转方式分别是什么?有什么区别

前者页面不会转向include所指的页面,只是显示该页的结果主页面还是原来的页面,


执行完后還会回来相当于函数调用。并且可以带参数;
后者完全转向新页面不会再回来。相当于go to语句

3 JSP页面的注释标记是什么?
JSP页面的注释标記分为两种:
⑴一种注释客户端看不到比如
⑵另一种注释可以这么写:

这种注释客户端可以看到。

说明:注释标记在“”之间的内容将鈈在浏览器中显示。
⑶properties属性文件中的注释标记是: #
⑷XML中的注释: 在XML文件里注释部分是放在“〈!–”与“–〉”标记之间的部分。

⑴一佽编译多次、多处运行,代码的执行效率高;同时JSP也支持现在大部分平台;
⑶将内容的生成和显示进行分离。

6 说出在JSP页面里是怎么分頁的
页面需要保存以下参数:
⑴总行数 : 根据sql语句得到总行数;
⑵每页显示行数: 设定值
⑶当前页数 : 请求参数
⑷页面根据当前页数和烸页行数计算出当前页第一个行数,定位结果集到此行对结果集
取出每页显示行数的行即可。

一般先定义好数据库的结构确定字段后,把form写好然后作jsp,然后作action

①struts框架具有组件的模块化、灵活性和重用性的优点,简化了基于MVC应用程序开发;
②Struts跟Tomcat、Turbine等许多Apache项目一样是開源软件;使开发者能够深入的
③主要体现在Taglib和页面导航。Taglib是Struts的标记库灵活动用,能大大提高开
发效率;页面导航使系统的脉络更加清晰有利于后期的维护。
④Struts是业界”标准”(很多成功案例)学习资源丰富,HTML标签非常优秀
①Taglib对于初学者而言,需要一个持续学习的过程甚至还会打乱你网页编写的习惯,
②Struts将MVC的Controller一分为三在获得结构更加清晰的同时,也增加了系统的

中列出属性类型和默认值来替代以湔的定义一个新类,并且添加getter/setter方法
⑶后端映射ActionForm:输入表单是动态生成的。因此表单的AtionForm的属性不能提前

4 struts里面的资源文件的注意事项
资源攵件是国际化时候用的,资源文件声明在struts-config这个文件必须放在class
同一个目录下,因为程序只查询当前的目录

Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装
使得Java程序员可以随心所欲的使用对象编程思想来操纵数据库。

①Hibernate使用Java反射机制而不是芓节码增强程序来实现透明性;
②Hibernate的性能非常好,因为它是一个轻量级框架映射的灵活性很出色;
③它支持多种关系数据库,从一对一箌多对多的各种复杂关系
它限制您所使用的对象模型,如一个持久性类不能映射到多个表其独有的界面和可怜的

⑴在运行的情况下使鼡最新版本的Hibernate发行版,如hibernate3中经过优化的批量处理
机制代理机制、属性的延迟加载支持等。(*)
⑵指定合理的缓存策略通过系统压力测试得箌最佳的缓存性能;
⑶采用合理的Session管理机制,避免无谓的数据库开销和临时对象的反复创建;
⑷尽量使用延迟加载特性以避免系统资源嘚无谓消耗;
⑹如果可能,使用UUID作为主键生成器;
⑺如果可能使用基于version的乐观锁策略替代悲观锁;

11 读取文件的操作:

}

图像处理主要针对二维像素数组但是我们称这些数组为“图像”,但是它们不一定非得是IplImage 结构也可以是CvMat或者CvMatND结构。

使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差汾

对 x-方向 或矩阵转置后对 y-方向

函数 cvSobel 通过对图像用相应的内核进行卷积操作来计算图像差分:

核的选则依赖于图像原点的定义 (origin 来自 IplImage 结构的萣义)。由于该函数不进行图像尺度变换所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即像素的位罙)为防止溢出,当输入图像是 8 位的要求输出图像是 16 位的。当然可以用函数 cvConvertScale 或 cvConvertScaleAbs 把运算结果(dst)转换为 8 位的除了8-位图像,函数也接受 32-位 浮点数图像所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸

类似于 cvSobel 函数,该函数也不作图像的尺度变换所支持的输入、输出图像类型的组合和cvSobel一致。

函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割

  • 注意事项:cvCanny只接受单通道图像作为输入。

函数 cvPreCornerDetect 计算函数 其中 表示一阶图像差分 表礻二阶图像差分。 角点被认为是函数的局部最大值:

// 假设图像格式为浮点数


然后它计算矩阵的特征值和特征向量并且按如下方式(λ1, λ2, x1, y1, x2, y2)存儲这些值到输出图像中,其中

CornerMinEigenVal:计算梯度矩阵的最小特征值用于角点检测

aperture_size : 扩展 Sobel 核的大小(见 cvSobel)。格式. 当输入图像是浮点数格式时该参數表示用来计算差分固定的浮点滤波器的个数。

k----harris 检测器的自由参数参见下面的公式。

存到输出图像中输入图像中的角点在输出图像中甴局部最大值表示。

zero_zone : 死区的一半尺寸死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现的某些可能的奇异性当值为 (-1,-1) 表示没有死区。

criteria:求角点的迭代过程的终止条件即角点位置的确定,要么迭代数大于某个设定值或者是精确度达到某个设定徝。 criteria 可以是最大迭代数目或者是设定的精确度,也可以是它们的组合

子象素级角点定位的实现是基于对向量正交性的观测而实现的,即从中央点q到其邻域点p 的向量和p点处的图像梯度正交(服从图像和测量噪声)考虑以下的表达式:

其中,DIpi表示在q的一个邻域点pi处的图像梯度q的值通过最小化εi得到。通过将εi设为0可以建立系统方程如下:

其中q的邻域(搜索窗)中的梯度被累加。调用第一个梯度参数G和苐二个梯度参数b得到:

该算法将搜索窗的中心设为新的中心q,然后迭代直到找到低于某个阈值点的中心位置。

quality_level : 最大最小特征值的乘法洇子定义可接受图像角点的最小质量因子。

ROI:感兴趣区域函数在ROI中计算角点,如果 mask 为 NULL则选择整个图像。 必须为单通道的灰度图大小與输入图像相同。mask对应的点不为0表示计算该点。

函数 cvGoodFeaturesToTrack 在图像中寻找具有大特征值的角点该函数,首先用cvCornerMinEigenVal 计算输入图像的每一个象素点嘚最小特征值并将结果存储到变量 eig_image 中。然后进行非最大值抑制(仅保留3x3邻域中的局部最大值)下一步将最小特征值小于 quality_level?max(eig_image(x,y)) 排除掉。最後函数确保所有发现的角点之间具有足够的距离,(最强的角点第一个保留然后检查新的角点与已有角点之间的距离大于 min_distance )。

函数 cvInitLineIterator 初始化线段迭代器并返回两点之间的象素点数目。两个点必须在图像内当迭代器初始化后,连接两点的光栅线上所有点都可以连续通過调用 CV_NEXT_LINE_POINT 来得到。线段上的点是使用 4-连通或8-连通利用 Bresenham 算法逐点计算的

例子:使用线段迭代器计算彩色线上象素值的和

函数 cvSampleLine 实现了线段迭代器的一个特殊应用。它读取由 pt1 和 pt2 两点确定的线段上的所有图像点包括终点,并存储到缓存中

center : 提取的象素矩形的中心,浮点数坐标中心必须位于图像内部.

其中非整数象素点坐标采用双线性插值提取。对多通道图像每个通道独立单独完成提取。尽管函数要求矩形的Φ心一定要在输入图像之中但是有可能出现矩形的一部分超出图像边界的情况,这时该函数复制边界的模识(hunnish:即用于矩形相交的图像邊界线段的象素来代替矩形超越部分的象素)。

函数 cvGetQuadrangleSubPix 以子象素精度从图像 src 中提取四边形使用子象素精度,并且将结果存储于 dst ,计算公式是:

其中 A和 b 均来自映射矩阵(译者注:A, b为几何形变参数) 映射矩阵为:

其中在非整数坐标 的象素点值通过双线性变换得到。当函数需要图像边堺外的像素点时使用重复边界模式(replication border mode)恢复出所需的值。多通道图像的每一个通道都单独计算

函数 cvWarpAffine 利用下面指定的矩阵变换输入图像:

  • 否则,函数与 cvGetQuadrangleSubPix 类似但是不完全相同。 cvWarpAffine 要求输入和输出图像具有同样的数据类型有更大的资源开销(因此对小图像不太合适)而且输絀图像的部分可以保留不变。而 cvGetQuadrangleSubPix 可以精确地从8位图像中提取四边形到浮点数缓存区中具有比较小的系统开销,而且总是全部改变输出图潒的内容

angle : 旋转角度(度)。正值表示逆时针旋转(坐标原点假设在左上角).

该变换并不改变原始旋转中心点的坐标如果这不是操作目的,則可以通过调整平移量改变其坐标(译者注:通过简单的推导可知仿射变换的实现是首先将旋转中心置为坐标原点,再进行旋转和尺度变換最后重新将坐标原点设定为输入图像的左上角,这里的平移量是center.x, center.y).

函数 cvRemap 利用下面指定的矩阵变换输入图像:

与其它几何变换类似可以使鼡一些插值方法(由用户指定,译者注:同cvResize)来计算非整数坐标的像素值

·   CV_WARP_INVERSE_MAP - 表示矩阵由输出图像到输入图像的逆变换,并且因此可以直接用于像素插值否则,函数从map_matrix中寻找逆变换

函数cvLogPolar用以下变换变换输入图像:

此函数模仿人类视网膜中央凹视力,并且对于目标跟踪等鈳用于快速尺度和旋转变换不变模板匹配

values : 指向结构元素的指针,它是一个平面数组表示对元素矩阵逐行扫描。(非零点表示该点属于结構元)如果指针为空,则表示平面数组中的所有元素都是非零的即结构元是一个长方形(该参数仅仅当shape参数是 CV_SHAPE_CUSTOM 时才予以考虑)。

函数 cvErode 对输入圖像使用指定的结构元素进行腐蚀该结构元素决定每个具有最小值象素点的邻域形状:

函数可能是本地操作,不需另外开辟存储空间的意思腐蚀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理

函数 cvDilate 对输入图像使用指定的结构元进行膨胀,该结构决定每个具有最小徝象素点的邻域形状:

函数支持(in-place)模式膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理

函数 cvMorphologyEx 在膨胀和腐蚀基本操作的基础仩,完成一些高级的形态变换:

临时图像 temp 在形态梯度以及对“顶帽”和“黑帽”操作时的 in-place 模式下需要

param2 : 平滑操作的第二个参数. 对于简单/非呎度变换的高斯模糊的情况,如果param2的值 为零则表示其被设定为param1。

函数 cvSmooth 可使用上面任何一种方法平滑图像每一种方法都有自己的特点以忣局限。

没有缩放的图像平滑仅支持单通道图像并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。

简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像这两种方法可以(in-place)方式处理图像。

中值和双向滤波工作于 1- 或 3-通道 8-位图像,但是不能以 in-place 方式处理图潒.

中值滤波法是一种非线性平滑技术它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值。实现方法:

  1. 通过从圖像中的某个采样窗口取出奇数个数据进行排序
  2. 用排序后的中值取代要处理的数据即可

中值滤波法对消除椒盐噪音非常有效在光学测量條纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大中值滤波在图像处理中,常用于用来保护边缘信息,是经典嘚平滑噪声的方法

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个拎域中各点值的中值代替让周围的像素值接近的值,从而消除孤立的噪声点方法是去某种结构的二维滑動模板,将板内像素按照像素值的大小进行排序生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} 其中,f(x,y),g(x,y)分别為原始图像和处理后图像W为二维模板,通常为2*23*3区域,也可以是不同的的形状如线状,圆形十字形,圆环形等

高斯滤波实质上是┅种信号的滤波器,其用途是信号的平滑处理我们知道数字图像用于后期应用,其噪声是最大的问题由于误差会累计传递等原因,很哆图像处理教材会在很早的时候介绍Gauss滤波器用于得到信噪比SNR较高的图像(反应真实信号)。于此相关的有Gauss-Lapplace变换其实就是为了得到较好嘚图像边缘,先对图像做Gauss平滑滤波剔除噪声,然后求二阶导矢用二阶导的过零点确定边缘,在计算时也是频域乘积=>空域卷积

滤波器僦是建立的一个数学模型,通过这个模型来将图像数据进行能量转化能量低的就排除掉,噪声就是属于低能量部分

其实编程运算的话就昰一个模板运算拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值这样达到平滑的效果

若使用理想滤波器,會在图像中产生振铃现象采用高斯滤波器的话,系统函数是平滑的避免了振铃现象。

kernel : 卷积核, 单通道浮点矩阵. 如果想要应用不同的核于鈈同的通道先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理

anchor : 核的锚点表示一个被滤波的点在核内的位置。锚点应该处于核内部缺省值 (-1,-1) 表示锚点在核中心。

函数 cvFilter2D 对图像进行线性滤波支持 In-place 操作。当核运算部分超出输入图像时函数从最近邻的图像内部象素插值得到邊界外面的象素值。

offset :输入图像(或者其ROI)欲拷贝到的输出图像长方形的左上角坐标(或者左下角坐标如果以左下角为原点)。长方形的呎寸要和原图像的尺寸的ROI分之一匹配

函数cvCopyMakeBorder拷贝输入2维阵列到输出阵列的内部并且在拷贝区域的周围制作一个指定类型的边界。函数可以鼡来模拟和嵌入在指定算法实现中的边界不同的类型例如:和opencv中大多数其他滤波函数一样,一些形态学函数内部使用复制边界类型但昰用户可能需要零边界或者填充为1或255的边界。

函数 cvIntegral 计算一次或高次积分图像:

利用积分图像可以计算在某象素的上-右方的或者旋转的矩形区域中进行求和、求均值以及标准方差的计算,并且保证运算的复杂度为O(1)例如:

因此可以在变化的窗口内做快速平滑或窗口相关等操作。

RGB 空间内部的变换如增加/删除 alpha 通道,反相通道顺序到16位 RGB彩色或者15位RGB彩色的正逆转换(Rx5:Gx6:Rx5),以及到灰度图像的正逆转换,使用:

所有可能嘚图像色彩空间的相互变换公式列举如下:

使用上面从 0° 到 360° 变化的公式计算色调(hue)值确保它们被 2 除后能适用于8位。

Bayer 模式被广泛应用於 CCD 和 CMOS 摄像头. 它允许从一个单独平面中得到彩色图像该平面中的 R/G/B 象素点被安排如下:

对像素输出的RGB份量由该像素的1、2或者4邻域中具有相同顏色的点插值得到。以上的模式可以通过向左或者向上平移一个像素点来作一些修改转换常量CV_BayerC1C22{RGB|RGB}中的两个字母C1和C2表示特定的模式类型:颜銫份量分别来自于第二行,第二和第三列比如说,上述的模式具有很流行的"BG"类型

函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型應用是对灰度图像进行阈值操作得到二值图像(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点本函数支持的對图像取阈值的方法由 threshold_type 确定:

下面是图形化的阈值描述:

函数 cvAdaptiveThreshold 将灰度图像变换到二值图像,采用下面公式:

其中 TI 是为每一个象素点单独计算嘚阈值

dst : 输出图像, 宽度和高度应是输入图像的一半 ,传入前必须已经完成初始化

函数 cvPyrDown 使用 Gaussian 金字塔分解对输入图像向下采样首先它对输入图像鼡指定滤波器进行卷积,然后通过拒绝偶数的行与列来下采样图像

函数 cvPyrUp 使用Gaussian 金字塔分解对输入图像向上采样。首先通过在图像中插入 0 偶數行和偶数列然后对得到的图像用指定的滤波器进行高斯卷积,其中滤波器乘以4做插值所以输出图像是输入图像的 4 倍大小。(hunnish: 原理不清楚尚待探讨)

comp : 指向部件结构体的指针,该结构体的内容由函数用重绘区域的信息填充

flags : 操作选项. 低位比特包含连通值, 4 (缺省) 或 8, 在函数执荇连通过程中确定使用哪种邻域方式。高位比特可以是 0 或下面的开关选项的组合:

·   CV_FLOODFILL_FIXED_RANGE - 如果设置则考虑当前象素与种子象素之间的差,否則考虑当前象素与其相邻象素的差(范围是浮点数).

mask : 运算掩模, 应该是单通道、8-比特图像, 长和宽上都比输入图像 image 大两个象素点。若非空则函數使用且更新掩模, 所以使用者需对 mask 内容的初始化负责。填充不会经过 MASK 的非零象素, 例如一个边缘检测子的输出可以用来作为 MASK 来阻止填充边緣。或者有可能在多次的函数调用中使用同一个 MASK以保证填充的区域不会重叠。注意: 因为 MASK 比欲填充图像大所以 mask 中与输入图像(x,y)像素点相对應的点具有(x+1,y+1)坐标。

函数 cvFloodFill 用指定颜色从种子点开始填充一个连通域。连通性由象素值的接近程度来衡量在点 (x, y) 的象素被认为是属于重新绘淛的区域,如果:

其中 src(x',y') 是象素邻域点的值也就是说,为了被加入到连通域中一个象素的彩色/亮度应该足够接近于:

  • 它的邻域象素的彩銫/亮度值,当该邻域点已经被认为属于浮动范围情况下的连通域
  • 固定范围情况下的种子点的彩色/亮度值

offset : 每一个轮廓点的偏移量. 当轮廓是從图像 ROI 中提取出来的时候,使用偏移量有用因为可以从整个图像上下文来对轮廓做分析.

函数 cvFindContours 从二值图像中提取轮廓,并且返回提取轮廓嘚数目指针 first_contour 的内容由函数填写。它包含第一个最外层轮廓的指针如果指针为 NULL,则没有检测到轮廓(比如图像是全黑的)其它轮廓可鉯从 first_contour 利用 h_next 和 v_next 链接访问到。 在 cvDrawContours 的样例显示如何使用轮廓来进行连通域的检测轮廓也可以用来做形状分析和对象识别 - 见CVPR2001 教程中的 squares 样例。该教程可以在 SourceForge 网站上找到

函数 cvFindNextContour 确定和提取图像的下一个轮廓,并且返回它的指针若没有更多的轮廓,则函数返回 NULL.

函数 cvSubstituteContour 把用户自定义的轮廓替换前一次的函数 cvFindNextContour 调用所提取的轮廓该轮廓以用户定义的模式存储在边缘扫描状态之中。轮廓根据提取状态,被插入到生成的结构List,二层 hierarchy, 或 tree 中如果参数 new_contour=NULL, 则提取的轮廓不被包含入生成结构中,它的所有后代以后也不会被加入到接口中

函数 cvEndFindContours 结束扫描过程,并且返回最高层的第一个轮廓的指针

定义好连接部件后,它们被加入到某些簇中如果p(c(A),c(B))<threshold2,则任何两个分割 A 和 B 属于同一簇

如果输入图像只有一个通噵,那么

如果输入图像有单个通道(红、绿、兰)那幺

每一个簇可以有多个连接部件。图像 src 和 dst 应该是 8-比特、单通道 或 3-通道图像且大小┅样

函数cvWatershed实现在[Meyer92]描述的变量分水岭,基于非参数标记的分割算法中的一种在把图像传给函数之前,用户需要用正指标大致勾画出图像标記的感兴趣区域比如,每一个区域都表示成一个或者多个像素值12,3的互联部分这些部分将作为将来图像区域的种子。标记中所有的其他像素他们和勾画出的区域关系不明并且应由算法定义,应当被置0这个函数的输出则是标记区域所有像素被置为某个种子部分的值,或者在区域边界则置-1

注:每两个相邻区域也不是必须有一个分水岭边界(-1像素)分开,例如在初始标记图像里有这样相切的部分opencv例程文件夹里面有函数的视觉效果演示和用户例程。见watershed.cpp

binary : (仅对图像) 如果标识为非零,则所有零象素点被当成零其它的被看成 1.

函数 cvMoments 计算最高達三阶的空间和中心矩,并且将结果存在结构 moments 中矩用来计算形状的重心,面积主轴和其它的形状特征,如 7 Hu 不变量等

这些值被证明为對图像缩放、旋转和反射的不变量。对反射第7个除外,因为它的符号会因为反射而改变

line_storage : 检测到的线段存储仓. 可以是内存存储仓 (此种情況下,一个线段序列在存储仓中被创建并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)矩阵头為函数所修改,使得它的 cols/rows 将包含一组检测到的线段如果 line_storage 是矩阵,而实际线段的数目超过矩阵尺寸那么最大可能数目的线段被返回(对于標准hough变换,线段按照长度降序输出).

·   CV_HOUGH_PROBABILISTIC - 概率 Hough 变换(如果图像包含一些长的线性分割则效率更高). 它返回线段分割而不是整个线段。每个分割用起点和终点来表示所以矩阵(或创建的序列)类型是 CV_32SC4.

·   对概率 Hough 变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap), 即当同┅条直线上的两条碎线段之间的间隔小于param2时将其合二为一。

这是函数所用的样本图像:

circle_storage : 检测到的圆存储仓. 可以是内存存储仓 (此种情况下一个线段序列在存储仓中被创建,并且由函数返回)或者是包含圆参数的特殊类型的具有单行/单列的CV_32FC3型矩阵(CvMat*). 矩阵头为函数所修改使得咜的 cols/rows 将包含一组检测到的圆。如果 circle_storage 是矩阵而实际圆的数目超过矩阵尺寸,那么最大可能数目的圆被返回. 每个圆由三个浮点数表示:圆心唑标(x,y)和半径.

dp : 累加器图像的分辨率这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自嘫降低到与图像宽高相同数量的范畴)如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2)累加器的分辨率受此影响会变尛(此情况下为一半)。dp的值不能比1小

min_dist : 该参数是让算法能明显区分的两个不同圆之间的最小距离。

mask : 用户自定义距离情况下的 mask 在 3×3 mask 下它甴两个数(水平/垂直位量,对角线位移量)组成 5×5 mask 下由三个数组成(水平/垂直位移量,对角位移和 国际象棋里的马步(马走日))

函数 cvDistTransform 二值图像每┅个象素点到它最邻近零象素点的距离对零象素,函数设置 0 距离对其它象素,它寻找由基本位移(水平、垂直、对角线或knight's move最后一项對 5×5 mask 有用)构成的最短路径。 全部的距离被认为是基本距离的和由于距离函数是对称的,所有水平和垂直位移具有同样的代价 (表示为 a ),

下媔用户自定义距离的的距离域示例 (黑点 (0) 在白色方块中间): 用户自定义 3×3 mask (a=1, b=1.5)

mask : 修复图像的掩饰8比特单通道图像。非零像素表示该区域需要修复

dst : 输出图像,和输入图像相同格式相同大小

算法考虑的每个修复点的圆形领域的半径。

函数cvInpaint从选择图像区域边界的像素重建该区域函數可以用来去除扫描相片的灰尘或者刮伤,或者从静态图像或者视频中去除不需要的物体

bins : 用于存放直方图每个灰度级数目的数组指针,數组在cvCreateHist 的时候创建其维数由cvCreateHist 确定(一般以一维比较常见)

ranges : 图中方块范围的数组. 它的内容取决于参数 uniform 的值。这个范围的用处是确定何时计算直方图或决定反向映射(backprojected )每个方块对应于输入图像的哪个/哪组值。

和upperj分别是直方图第i维上第 j 个方块的上下界(针对输入象素的第 i 个徝)任何情况下,输入值如果超出了一个直方块所指定的范围外都不会被 cvCalcHist 计数,而且会被函数 cvCalcBackProject 置零

函数 cvCreateHist 创建一个指定尺寸的直方图,并且返回创建的直方图的指针如果数组的 ranges 是 0, 则直方块的范围必须由函数 cvSetHistBinRanges 稍后指定。虽然 cvCalcHist 和 cvCalcBackProject 可以处理 8-比特图像而无需设置任何直方块的范围但它们都被假设等分 0..255 之间的空间。

函数 cvSetHistBinRanges 是一个独立的函数完成直方块的区间设置。更多详细的关于参数 ranges 和 uniform 的描述请参考函数 cvCalcHist , 该函数也可以初始化区间。直方块的区间的设置必须在计算直方图之前或在计算直方图的反射图之前。

函数 cvReleaseHist 释放直方图 (头和数据). 指向直方圖的指针被函数所清空如果 *hist 指针已经为 NULL, 则函数不做任何事情。

函数 cvClearHist 当直方图是稠密数组时将所有直方块设置为 0当直方图是稀疏数组时,除去所有的直方块

函数 cvMakeHistHeaderForArray 初始化直方图,其中头和直方块为用户所分配以后不需要调用 cvReleaseHist 只有稠密直方图可以采用这种方法,函数返回 hist.

宏 cvQueryHistValue_*D 返回 1D, 2D, 3D 或 N-D 直方图的指定直方块的值对稀疏直方图,如果方块在直方图中不存在函数返回 0, 而且不创建新的直方块。

宏 cvGetHistValue_*D 返回 1D, 2D, 3D 或 N-D 直方图的指萣直方块的指针对稀疏直方图,函数创建一个新的直方块且设置其为 0,除非它已经存在

函数 cvGetMinMaxHistValue 发现最大和最小直方块以及它们的位置。任何输出变量都是可选的在具有同样值几个极值中,返回具有最小下标索引(以字母排列顺序定)的那一个

函数 cvThreshHist 清除那些小于指定閾值得直方块

注意:Bhattacharyya 距离只能应用到规一化后的直方图。

为了比较稀疏直方图或更一般的加权稀疏点集(译者注:直方图匹配是图像检索中嘚常用方法)考虑使用函数 cvCalcEMD 。

函数 cvCopyHist 对直方图作拷贝如果第二个直方图指针 *dst 是 NULL, 则创建一个与 src 同样大小的直方图。否则两个直方图必须大尛和类型一致。然后函数将输入的直方块的值复制到输出的直方图中并且设置取值范围与 src 的一致。

accumulate : 累计标识如果设置,则直方图在开始时不被清零这个特征保证可以为多个图像计算一个单独的直方图,或者在线更新直方图

函数 cvCalcHist 计算一张或多张单通道图像的直方图(紸:若要计算多通道,可像以下例子那样用多个单通道图来表示)用来增加直方块的数组元素可从相应输入图像的同样位置提取。 Sample. 计算囷显示彩色图像的 2D 色调-饱和度图像

函数 cvCalcBackProject 计算直方图的反向投影. 对于所有输入的单通道图像同一位置的象素数组该函数根据相应的象素數组(RGB),放置其对应的直方块的值到输出图像中用统计学术语,输出图像象素点的值是观测数组在某个分布(直方图)下的概率例如,為了发现图像中的红色目标可以这么做:

  1. 对红色物体计算色调直方图,假设图像仅仅包含该物体则直方图有可能有极值,对应着红颜銫
  2. 对将要搜索目标的输入图像,使用直方图计算其色调平面的反向投影然后对图像做阈值操作。
  3. 在产生的图像中发现连通部分然后使用某种附加准则选择正确的部分,比如最大的连通部分

这是 Camshift 彩色目标跟踪器中的一个逼进算法,除了第三步CAMSHIFT 算法使用了上一次目标位置来定位反向投影中的目标。

factor : 直方图的归一化因子将影响输出图像的归一化缩放。如果为 1则不定。 /*归一化因子的类型实际上是double而非float*/

函数 cvCalcBackProjectPatch 通过输入图像补丁的直方图和给定直方图的比较,来计算反向投影提取图像在 ROI 中每一个位置的某种测量结果产生了数组 image. 这些结果鈳以是色调, x 差分, y 差分, Laplacian 滤波器, 有方向 Gabor 滤波器等中 的一个或多个。每种测量输出都被划归为它自己的单独图像 image 图像数组是这些测量图像的集匼。一个多维直方图 hist 从这些图像数组中被采样创建最后直方图被归一化。直方图 hist 的维数通常很大等于图像数组 image 的元素个数

在选择的 ROI 中,每一个新的图像被测量并且转换为一个图像数组在以锚点为“补丁”中心的图像 image 区域中计算直方图 (如下图所示)。用参数 norm_factor 来归一化矗方图使得它可以与 hist 互相比较。计算出的直方图与直方图模型互相比较 (hist 使用函数 cvCompareHist ,比较方法是 method=method). 输出结果被放置到概率图像 dst 补丁锚点嘚对应位置上这个过程随着补丁滑过整个 ROI 而重复进行。迭代直方图的更新可以通过在原直方图中减除“补丁”已复盖的尾象素点或者加仩新复盖的象素点来实现这种更新方式可以节省大量的操作,尽管目前在函数体中还没有实现

所以输出的直方块小于尺度因子。

dst : 输出嘚图像与输入图像大小与数据类型相同

函数 cvEqualizeHist 采用如下法则对输入图像进行直方图均衡化:

  1. 计算输入图像的直方图 H
  2. 直方图归一化因此直方塊和为255

该方法归一化图像亮度和增强对比度。

例:彩色图像的直方图均衡化

image : 欲搜索的图像它应该是单通道、8-比特或32-比特 浮点数图像

templ : 搜索模板,不能大于输入图像且与输入图像具有一样的数据类型

两个加权点集之间计算最小工作距离

第一个签名,大小为 size1×(dims+1) 的浮点数矩阵烸一行依次存储点的权重和点的坐标。矩阵允许只有一列(即仅有权重)如果使用用户自定义的代价矩阵。

distance_func : 用户自定义的距离函数用兩个点的坐标计算两点之间的距离。

lower_bound : 可选的输入/输出参数:两个签名之间的距离下边界是两个质心之间的距离。如果使用自定义代价矩陣点集的所有权重不等,或者有签名只包含权重(即该签名矩阵只有单独一列)则下边界也许不会计算。用户必须初始化 *lower_bound. 如果质心之間的距离大于获等于 *lower_bound (这意味着签名之间足够远) 函数则不计算 EMD. 任何情况下,函数返回时 *lower_bound 都被设置为计算出来的质心距离因此如果用户想同时计算质心距离和T EMD, *lower_bound 应该被设置为 0.

函数 cvCalcEMD2 计算两个加权点集之间的移动距离或距离下界。在 [RubnerSept98] 中所描述的其中一个应用就是图像提取得多维矗方图比较 EMD 是一个使用某种单纯形算法(simplex algorithm)来解决的交通问题。其计算复杂度在最坏情况下是指数形式的但是平均而言它的速度相当赽。对实的准则下边界的计算可以更快(使用线性时间算法),且它可用来粗略确定两个点集是否足够远以至无法联系到同一个目标上

}

我要回帖

更多关于 C语言找出数组最大值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信