1.1.定义:归一化把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
1.2.优点:归一化使数据有可比性,同时又保持相比较的两个数据之间的相对关系
转换成标准模式,防止仿射变换的影响。
减小几何变换的影响;加快梯度下降求最优解的速度,收敛加快
1.3.作用:归纳统一样本统计分布;归一化在0-1是统计概率分布;归一化在某区间上是统计的坐标分布
1.4.方法:
1)线性函数转换:y=(x-MinValue)/(MaxValue-MinValue)
2)对数函数转换:y=log10(x)
3)反余切转换: y=atan(x)*2/PI
4)Z-score正态标:y=(x-x_mean)/std
5)Sigmoid函数: yt=1/(1+e^(-x))
2.函数
dst =cv2.normalize(src,dst [,double alpha=1,double beta=0,int norm_type,int dtype,mask])
用途:归一化数据。该函数分为范围归一化与数据值归一化
参数:
src 输入数组
dst 输出数组,数组的大小和原数组一致;
alpha 1,用来规范值,2.规范范围,并且是下限;
beta 只用来规范范围并且是上限
norm_type 归一化选择的数学公式类型;
1)NORM_MINMAX;(依据是:delta=max-min,也即最小值为0,最大值为1)最常用
NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化。
比如归一化到(min,max)范围内:(X-min(X))*(max-min)/(max(X)-min(X))+min
2)NORM_INF;(切比雪夫距离)L∞范数(绝对值的最大值) X/max(abs(X))
3)NORM_L1;(曼哈顿距离)L1-范数(绝对值的和) X/sum(abs(X))
4)NORM_L2;(依据是:单位向量为1,也即每个数除以 根号下所有数的平方和)
(欧几里德距离)L2-范数 X/sqrt((sum(X^2)))
dtype 为负输出数组type与输入数组type相同;为正仅通道数相同而tpye=CV_MAT_DEPTH(dtype).
mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作。
说明:
1)NORM_MINMAX多用于密集阵列;可用范围归一化和值归一化
2)其他3项多用于稀疏矩阵;,仅分析和转换非零值。因此,不允许对稀疏矩阵进行范围转换
若用范围将输出全部是0
3)范围归一化用:image/max(image)*255 设范围为【0,255】即把src缩放到【0,255】这个范围内
beta>alpha
2.实例:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: tcy
# @Date: 2020-5-2 22:00:53
# @Version:V1.01
# @Last Modified by: tcy
# @Last Modified time: 2020-5-3 4:39:53
import cv2,numpy as np
import skimage as sk
class Color:
def minmaxNormalization(self,image):
Max=image.max()
Min=image.min()
return (image - Min) / (Max - Min)
def L1Normalization(self,image):
return image/np.abs(image).sum()
def L2Normalization(self,image):
tmp=np.sqrt(np.sum(np.power(image,2)))
return image/tmp
def infNormalization(self,image):
return image/image.max()
def normalization(self,image,alpha=1,beta=0,norm_type='minmax'):
keys=['l1','l2','inf','minmax']
values=[cv2.NORM_L1,cv2.NORM_L2,cv2.NORM_INF,cv2.NORM_MINMAX]
d=dict(zip(keys,values))
if norm_type not in keys:
raise Exception('norm_type parameter error!')
dst=cv2.normalize(image,None,alpha,beta,d[norm_type])
return dst
# Z-score标准化:result=(x-x_mean)/std 数据符合标准正态分布x=0,s=1
def z_scoreNormalization(self,image):
mu=np.average(image)
sigma=np.std(image)
x = (image - mu) / sigma
return x
#Sigmoid函数 result=1/(1+e^(-x))
def sigmoid(self,image):
"""
具有S形曲线的函数,是良好的阈值函数,在(0, 0.5)处中心对称,在(0, 0.5)附近有比较大的斜率,
而当数据趋向于正无穷和负无穷的时候,映射出来的值就会无限趋向于1和0
Sigmoid函数在阈值分割上也有很不错的表现;只考虑(0, 0.5)作为分割阈值的点的情况:
"""
img=image.astype(np.float32)
return 1.0 / (1 + np.exp(-img))
def view(self,image,no=''):
print()
print(no)
print(image)
def test_normalization(self):
gray=np.array([[22,-33,44,45],[111,0,113,114],[31,32,33,255]],dtype=np.float)
g11=self.L1Normalization(gray)
g12=self.normalization(gray,norm_type='l1')
g21=self.L2Normalization(gray)
g22=self.normalization(gray,norm_type='l2')
g31=self.infNormalization(gray)
g32=self.normalization(gray,norm_type='inf')
g41=self.minmaxNormalization(gray)
g42=self.normalization(gray,norm_type='minmax')
g51=self.z_scoreNormalization(gray)
g52=self.sigmoid(gray)
self.view(gray,'1.gray')
self.view(g11,'1.1 g11=')
self.view(g12,'1.2 g12=')
self.view(g21,'2.1 g21=')
self.view(g22,'2.2 g22=')
self.view(g31,'3.1 g31=')
self.view(g32,'3.2 g32=')
self.view(g41,'4.1 g41=')
self.view(g42,'4.2 g42=')
self.view(g51,'4.1 g51=')
self.view(g52,'4.2 g52=')
if __name__=="__main__":
import os
girl=os.getcwd()+'\\data\\girl.jpg'
image = cv2.imread(girl)
a=Color()
a.test_normalization()
'''
test_normalization()输出结果:
1.gray
[[ 22. -33. 44. 45.]
[111. 0. 113. 114.]
[ 31. 32. 33. 255.]]
1.1 g11=
[[ 0.02641056 -0.03961585 0.05282113 0.05402161]
[ 0.1332533 0. 0.13565426 0.13685474]
[ 0.03721489 0.03841537 0.03961585 0.30612245]]
1.2 g12=
[[ 0.02641056 -0.03961585 0.05282113 0.05402161]
[ 0.1332533 0. 0.13565426 0.13685474]
[ 0.03721489 0.03841537 0.03961585 0.30612245]]
2.1 g21=
[[ 0.06582019 -0.09873029 0.13164039 0.13463222]
[ 0.3320928 0. 0.33807645 0.34106828]
[ 0.09274664 0.09573846 0.09873029 0.76291589]]
2.2 g22=
[[ 0.06582019 -0.09873029 0.13164039 0.13463222]
[ 0.3320928 0. 0.33807645 0.34106828]
[ 0.09274664 0.09573846 0.09873029 0.76291589]]
3.1 g31=
[[ 0.08627451 -0.12941176 0.17254902 0.17647059]
[ 0.43529412 0. 0.44313725 0.44705882]
[ 0.12156863 0.1254902 0.12941176 1. ]]
3.2 g32=
[[ 0.08627451 -0.12941176 0.17254902 0.17647059]
[ 0.43529412 0. 0.44313725 0.44705882]
[ 0.12156863 0.1254902 0.12941176 1. ]]
4.1 g41=
[[0.19097222 0. 0.26736111 0.27083333]
[0.5 0.11458333 0.50694444 0.51041667]
[0.22222222 0.22569444 0.22916667 1. ]]
4.2 g42=
[[0.19097222 0. 0.26736111 0.27083333]
[0.5 0.11458333 0.50694444 0.51041667]
[0.22222222 0.22569444 0.22916667 1. ]]
4.1 g51=
[[-0.5799108 -1.34082756 -0.2755441 -0.26170925]
[ 0.65139086 -0.8842775 0.67906056 0.69289541]
[-0.45539715 -0.4415623 -0.42772745 2.64360928]]
4.2 g52=
[[1.000000e+00 4.658886e-15 1.000000e+00 1.000000e+00]
[1.000000e+00 5.000000e-01 1.000000e+00 1.000000e+00]
[1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00]]
'''
3.备注:
L1 归一化(依据是:和为1)
2.0+8.0+10.0=20
2.0 0.1 (2.0/20.0)
8.0 0.4 (8.0/20.0)
10.0 0.5 (10.0/20.0)
L2 归一化(依据是:单位向量为1,也即每个数除以 根号下所有数的平方和)
2.0 0.15
8.0 0.62
10.0 0.77
NORM_INF 归一化(依据是:最大值)
2.0 0.2 (2.0/10.0)
8.0 0.8 (8.0/10.0)
10.0 1.0 (10.0/10.0)
NORM_MINMAX 归一化(依据是:delta=max-min,也即最小值为0,最大值为1)
2.0 0.0 (0.0/8.0)
8.0 0.75 (6.0/8.0)
10.0 1.0 (8.0/8.0)
tcy23456
原创文章 334获赞 55访问量 18万+
关注
私信
展开阅读全文
作者:tcy23456