Python中mad函数 python mad

验证码识别之模板匹配方法在写爬虫的时候难免会遇到验证码识别的问题,常见的验证码识别的流程为:
- 图像灰度化
- 图像去噪(如图像二值化)
- 切割图片
- 提取特征
- 训练
但这种方法要切割图片,而且破解验证码的重点和难点就在于 能否成功分割字符。
本文要介绍的算法 不需要进行图片切割,也不需要进行机器训练 ,这种方法就是模板匹配:将待识别的文字切割成一个个模板,在待识别的图像中去匹配模板 。
这篇文章将分为两个部分:
第一部分介绍模板匹配的基本概念以及模板匹配的一种实现算法:快速归一化互相关匹配算法;
第二部分是一个具体实例 。
模板匹配是在图像中寻找目标的方法之一,目的就是在一幅图像中寻找和模板图像最相似的区域 。
模板匹配的大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配 。
假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:
从输入图像的左上角(0,0)开始 , 切割一块(0,0)至(10,10)的临时图像;
用某种方法得出临时图像与模板的相似度c,存放到相似度矩阵中(矩阵大小为91 x91);
切割输入图像从(0,1)至(10,11)的临时图像,对比,并记录到相似度矩阵;
重复上述步骤,直到输入图像的右下角 。
最终得到一个相似度矩阵,找到矩阵中的最大或最小值 , 最大值(最小值)对应的临时图像即为与模板最相似的图像 。
在步骤b中,求模板与图像的相似度有多种方法,如平均绝对差算法(MAD)、绝对误差和算法(SAD)、误差平方和算法(SSD)、归一化互相关算法(NCC),本文使用的是归一化互相关算法 。
什么是归一化互相关?
从几何图形上来看 , 空间中的两个向量,同方向平行时 , 归一化互相关系数为1,表示两个向量最相似 , 反方向平行时归一化互相关系数为-1,垂直时为0,表示最不相似(用互相垂直的三个向量来代表整个空间也是这个道理,垂直的向量之间不包含对方的信息,相关系数为0) , 存在一定夹角时处于(-1,1),是不是跟余弦函数很像,cos(0)=1,cos(pi/2)=0,cos(pi)=-1 。就是这个样子的,相关系数可以看作是两个向量之间夹角的cosine函数 。
在数学中是这么计算cosine函数的,假设两个n维向量X,Y,对应的坐标分别为(x1,x2,…xn), (y1,y2 , …yn) 则:
(如果想要了解更多,请参考文献【2】)
但这是一维的,在模板匹配中要再加一个维度 (具体算法请参考文献【3】),简要说一下文献【3】的内容:如果直接计算二维相似度的话计算复杂度会非常高,文献【3】利用快速傅里叶变换与积分图像快速算法来降低计算复杂度 。
接下来让我们看一个具体的应用 。
模板匹配识别验证码的具体步骤为:
1. 找出图片中所有可能出现的字符,制作成模板集合
2. 图像灰度化
3. 图片去噪(二值化)
4. 模板匹配
5. 匹配结果优化
要识别的图片如下,以识别图片中的加字为例:
要从image中找到与模板最匹配的部分,Template图像是事先从image图像中截取的一部分 。所用的为python模块skimage中的match_template方法,match_template方法使用的是快速归一化互相关算法 【2】。
遍历模板图像集合 , 与图像匹配,如果dist大于阈值h,则认为此模板在图像中存在,否则不存在,继续匹配下一个模板,直到遍历完所有模板 。
以模板‘加’为例,图像大小为40x260,模板大小27x27,result是一个大小为(14,234)的矩阵,即上文提到的相似度矩阵,矩阵中的数值属于[-1,1],找到result中最大值所处的对应位置即为与模板最匹配的图像位置:x=66,y=11,正好对应模板图像在image中所处的位置 。(更多内容请参阅参考文献【4】)
但这是比较好的情况,因为在匹配时遍历了所有的模板 , 而一张图片中出现的模板数量是有限的,比如数字’四’在图片中是没有的,这时就要根据某种规则去掉这些在图片中没有出现的模板:程序中使用dist变量来过滤匹配结果,如果dist变量大于某个值则认为此模板在图像中不存在 。
最后的result_list中可能仍然存在一些图片中不存在的模板或者匹配不精确的模板,比如数字‘一’在模板中不存在,但仍然可以匹配到 , 因为数字‘二’中可以匹配到‘一’,需要进一步优化,优化方法有很多 , 比如当匹配到的两个模板距离过近时,选择较大的那个模板,其余方法留给读者自行考虑吧 。
后续将会推出如何使用深度学习识别验证码,敬请期待~
参考文献:
J. P. Lewis, “Fast Normalized Cross-Correlation”, Industrial Light and Magic.
本文作者 :李晖(点融黑帮),毕业于电子科技大学,现就职于点融成都Data部门,对一切新鲜事物充满好奇 , 对跳舞毫无抵抗力的活力女青年一枚 。
Python分组前言分组原理
核心:
1.不论分组键是数组、列表、字典、Series、函数,只要其与待分组变量Python中mad函数的轴长度一致都可以传入groupby进行分组 。
2.默认axis=0按行分组,可指定axis=1对列分组 。
对数据进行分组操作Python中mad函数的过程可以概括为:split-apply-combine三步:
1.按照键值(key)或者分组变量将数据分组 。
2.对于每组应用Python中mad函数我们Python中mad函数的函数,这一步非常灵活 , 可以是python自带函数,可以是我们自己编写的函数 。
3.将函数计算后的结果聚合 。
1 分组模式及其对象
1.1 分组的一般模式
三个要素:分组依据、数据来源、操作及其返回结果
df.groupby(分组依据)[数据来源].使用操作
1.2 分组依据的本质
1.3Groupby 对象
通过 ngroups 属性,可以访问分为了多少组:
通过 groups 属性,可以返回从 组名映射到 组索引列表的字典:
当 size 作为 DataFrame 的属性时,返回的是表长乘以表宽的大小,但在 groupby 对象上表示统计每个组的 元素个数:
通过 get_group 方法可以直接获取所在组对应的行,此时必须知道组的具体名字:
1.4 分组的三大操作
分组的三大操作:聚合、变换和过滤
2.聚合函数
2.1内置聚合函数
包括如下函数: max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
2.2agg 方法
【a】使用多个函数
当使用多个聚合函数时,需要用列表的形式把内置聚合函数的对应的字符串传入 , 先前提到的所有字符串都是合法的 。
【b】对特定的列使用特定的聚合函数
对于方法和列的特殊对应,可以通过构造字典传入 agg 中实现 , 其中字典以列名为键 , 以聚合字符串或字符串列表为值 。
【c】使用自定义函数
在 agg 中可以使用具体的自定义函数 , 需要注意传入函数的参数是之前数据源中的列,逐列进行计算
【d】聚合结果重命名 如果想要对结果进行重命名 , 只需要将上述函数的位置改写成元组,元组的第一个元素为新的名字,第二个位置为原来的函数 , 包括聚合字符串和自定义函数
3 变换和过滤
3.1 变换函数与 transform 方法
变 换 函 数 的 返 回 值 为 同 长 度 的 序 列,最 常 用 的 内 置 变 换 函 数 是 累 计 函 数:cum- count/cumsum/cumprod/cummax/cummin ,它们的使用方式和聚合函数类似 , 只不过完成的是组内 累计操作 。
3.2 组索引与过滤
过滤在分组中是对于组的过滤 , 而索引是对于行的过滤
组过滤作为行过滤的推广,指的是如果对一个组的全体所在行进行统计的结果返回 True 则会被保留,False 则该组会被过滤,最后把所有未被过滤的组其对应的所在行拼接起来作为 DataFrame 返回 。
在 groupby 对象中 , 定义了 filter 方法进行组的筛选,其中自定义函数的输入参数为数据源构成的 DataFrame 本身,在之前例子中定义的 groupby 对象中,传入的就是 df[['Height', 'Weight']] ,因此所有表方法和属性 都可以在自定义函数中相应地使用 , 同时只需保证自定义函数的返回为布尔值即可 。
4 跨列分组
4.1 apply 的引入
4.2 apply 的使用
在设计上,apply 的自定义函数传入参数与 filter 完全一致,只不过后者只允许返回布尔值
【a】标量情况:结果得到的是 Series ,索引与 agg 的结果一致
【b】Series 情况:得到的是 DataFrame,行索引与标量情况一致,列索引为 Series 的索引
【c】DataFrame 情况:得到的是 DataFrame ,行索引最内层在每个组原先 agg 的结果索引上,再加一层返 回的 DataFrame 行索引,同时分组结果 DataFrame 的列索引和返回的 DataFrame 列索引一致
求助 python怎么将可变参数传到列表中?可以在perfom里面把传递进来的参数member 循环到一个列表里面,然后再传递给another_perform
def perform (self, *member):
parmas={}
for para in memeber:
params.add(para)
another_perform("commad", list= parmas )
matlab—数据处理的函数1、rmmissing删除缺失Python中mad函数的条目
官方文档
R = rmmissing(A)
如果 A 是向量Python中mad函数,则 rmmissing 会删除包含缺失数据的所有条目 。如果 A 是矩阵或表Python中mad函数 , 则 rmmissing 会删除包含缺失数据的 所有行。缺失值的定义取决于 A 的数据类型 。(相当于python里面的dropna)
可以:
只删除在 Age 或 ID 表变量中包含缺失值的行 。
R = rmmissing(A,'DataVariables',{'Age','ID'})
R = rmmissing(A,'DataVariables',@isnumeric)
2、filloutliers检测并替换数据中的离群值
B = filloutliers(A,fillmethod,movmethod,window)
查找 A 中的离群值并根据 fillmethod 替换它们 。例如,filloutliers(A,'previous') 将离群值替换为上一个非离群值元素 。默认情况下 , 离群值是指与中位数相差超过三倍经过换算的中位数绝对偏差 (MAD)的值。如果 A 是矩阵或表,则 filloutliers 分别对每一列进行运算 。如果 A 是多维数组,则 filloutliers 沿大小不等于 1 的第一个维度进行运算 。
3、quantile分位数函数
q_stop = quantile(data(i), 0.95);%从小到大,95%位置的数
q_work = quantile(data(i), 0.05);%从小到大,5%位置的数
相当于 python里面的np.percentile(train_s, 50) 只不过python里面用的是百位数
4、switch数组问题
switch 和 case后面不能用矩阵,怎么改动可以实现Python中mad函数???
答:将矩阵写成字符串 , 注意逗号和空格的区别,如下例所示 。
judge = [state_rpm state_sampling];%judge = [0 1]
switch mat2str(judge)
case '[-1 -1]'
state2 = -1;%没有数据
case {'[0 0]','[0 -1]','[-1 0]','[0 1]','[1 -1]','[1 0]'}
state2 = 0;%停机
otherwise
state2 = 2;%停机
end
python(pandas模块)?1.什么是pandas? numpy模块和pandas模块都是用于处理数据Python中mad函数的模块 。numpy主要用于针对数组进行统计计算,处理数字数据比较方便 。pandas除Python中mad函数了可以处理数字数据,还可...
关于libmad解码库的问题MAD(libmad)是一个开源的高精度MPEG音频解码库,支持MPEG-1标准 。libmad提供24-bit的PCM输出,完全定点计算 , 非常适合在没有浮点支持的嵌入式硬件平台上使用 。使用libmad提供的一系列API可以实现MP3文件的解码 。
“mad.h”头文件定义了libmad的数据结构及API函数[15] 。
表4 libmad中的主要数据结构
主要数据结构
作用
struct mad_stream
存放解码前的Bitstream数据
struct mad_synth
存放解码合成滤波后的PCM数据
struct mad_pcm
定义了音频的采样率,声道个数和PCM采样数据,用来初始化音频
struct mad_frame
记录MPEG帧解码后PCM数据的数据结构 , 其中的mad_header用来记录MPEG帧的基本信息,比如MPEG层数、声道模式、流比特率、采样比特率 。声道模式包括单声道、双声道、联合立体混音道以及一般立体声 。
MAD通过回调函数机制来实现解码,每个回调函数会返回一个枚举类型mad_flow,通过mad_flow可以控制解码的过程 。在未经处理的情况下,MAD一般输出32bit,以little endian格式存放在mad_fixed_t中的数据 。但是大多数的声卡并不能支持输出高达32bit精度的数据,因而还必须对mad_fixed_t进行量化,圆滑处理以及抖动,使到采样信号降到16bit精度 。MAD负责的只是解码的过程,它工作过程是:从外部获取输入,逐帧解码,在解码的过程中返回信息,然后得到解码结果 。开发人员要手动设置输入输出 。
编程实现解码的方法为:初始化mad_decoder,里面包含了指向输入、输出、滤波、错误和消息回调函数的指针 。通过mad_decoder_init()实现初始化[16] 。
struct mad_decoder decoder;
struct my_playbuf playbuf;//设置数据缓冲区
mad_decoder_init(decoder,playbuf,input_func,header_func,/*filter*/0, output_func, /*error*/ 0, /* message */ 0);
在这个初始化函数里面,回调输入函数指向了input_func,处理帧头信息的函数指向了header_func,而输出函数则为output_func 。其它的滤波,错误和信息函数没有设置,置0 。
接着,MAD进入了一个解码的循环过程:
当解码函数里面的数据解码完毕时,调用input_func函数;
当input_func函数告知解码函数全部数据已经解码完毕,则MAD处理退出;
对帧头进行解码,调用header_func函数;
对帧中的主数据进行解码;
调用filter_func函数;
将解码数据输出,调用output_func函数;
重复上述步骤 。
MAD在每进行一帧的解码结束后都会询问mad_flow的状态,以决定是否进行下一帧的解码 。enum mad_flow的数据结构定义如下:
enum mad_flow{
MAD_FLOW_CONTINUE = 0x0000,/*继续进行下一帧的解码*/
MAD_FLOW_STOP = 0x0010,/*停止对该比特流的解码并正常退出*/
MAD_FLOW_BREAK = 0x0010,/*停止对该比特流的解码并返回错误*/
MAD_FLOW_IGNORE = 0x0020/*不解码该帧,跳入下一帧*/
};
大多数情况下回调函数会返回MAD_FLOW_CONTINUE 。要自定义实现的回调函数的声明格式为:
enum mad_flow (*input_func)(void *, struct mad_stream *);
enum mad_flow (*header_func)(void *, struct mad_header const *);
enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct mad_frame *);
enum mad_flow (*output_func)(void *, struct mad_header const *, struct mad_pcm *);
enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);
enum mad_flow (*message_func)(void *, void *, unsigned int *);
其中void *指针将缓冲数据传递给这些回调函数,由回调函数对数据进行处理 。Input_func函数一般会执行以下操作:
if (more_data_available)
buffer = refill_buffer();
mad_stream_buffer(stream, buffer, length_of_buffer);
return MAD_FLOW_CONTINUE;
else return MAD_FLOW_STOP;
header_func函数会根据mad_header指向的帧头从中读取重要的帧信息,如将读取到的帧长度赋值给mad_timer_t,可以从mad.h中得知存放这些信息的数据结构 。
在output_func函数中 , 利用指向PCM数据的指针mad_pcm,执行类似以下操作:
mad_fixed_t *left_ch = pcm-samples[0], *right_ch =pcm-samples[1];//将采样数据分别输出到左右声道
int nsamples = pcm-length;
signed int sample;
unsigned char * buffer = some_buffer;
unsigned char * ptr = buffer;
while (nsamples--)
{
sample = (signed int) do_downsample(*left_ch)
*ptr= (unsigned char) (sample0);
*ptr= (unsigned char) (sample8);
sample = (signed int) do_downsample(*right_ch)
*ptr= (unsigned char) (sample0);
*ptr= (unsigned char) (sample8);
//处理左右声道采样数据,输出16bit little endian格式PCM
}
定义好各回调函数之后,便可以开始解码:
mad_decoder_run(decoder, MAD_DECODER_MODE_SYNC);
解码完毕后,调用mad_decoder_finish(decoder);
【Python中mad函数 python mad】关于Python中mad函数和python mad的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读