python opencv-图像数据归一化

Iola ·
更新时间:2024-09-21
· 627 次阅读

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



数据 归一化 opencv Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号