归一化就是把数据经过处理后限制在某个特定范围内。归一化的目的,是将没有可比性的数据变得具有可比性,同时又保持着之间的相对关系。
opencv
中使用 normalize
方法来实现归一化,它的函数原型如下
cv2.normalize(src, dst, alpha=None, beta=None, norm_type=None, dtype=None, mask=None)
其中:
- src: 输入矩阵
- dst: 输出矩阵, 与输入矩阵形状相同
- alpha: 如果
norm_type
为NORM_MINMAX
,则alpha
为大值或小值;如果norm_type
为其他类型时,则为归一化要乘的系数 - beta: 如果
norm_type
为NORM_MINMAX
,则beta
为小值或大值,和alpha
对应;如果norm_type
为其他类型,beta
被忽略,一般传入0 - norm_type: 归一化类型,常见的有
NORM_MINMAX
、NORM_INF
、NORM_L1
、NORM_L2
- dtype: 默认类型与
src
相同,可选参数 - mask: 可选操作掩膜,默认为空
示例
import cv2
import numpy as np
image = cv2.imread('lenna.png')
cv2.imshow("original image", image)
# 灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 转换为浮点数类型数组
gray = np.float32(gray)
# NORM_MINMAX,最常用的一种方法,数组的数值会被缩放到一个指定的范围,比如本例中的 0~1
dst = np.zeros(gray.shape, dtype=np.float32)
# 这里alpha=1, beta=0也是ok的
cv2.normalize(gray, dst=dst, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
# 显示原图时,需要将像素值 re-scale 到 0~255
cv2.imshow("NORM_MINMAX", np.uint8(dst*255))
# NORM_INF,无穷范数,每个值除以最大值来进行无穷范数归一化
dst = np.zeros(gray.shape, dtype=np.float32)
cv2.normalize(gray, dst=dst, alpha=1.0, beta=0, norm_type=cv2.NORM_INF)
# 归一化后最大值就是1,所以也是*255
cv2.imshow("NORM_INF", np.uint8(dst*255))
# NORM_L1,1范数,每个值除以它们的和来进行归一化
dst = np.zeros(gray.shape, dtype=np.float32)
cv2.normalize(gray, dst=dst, alpha=1.0, beta=0, norm_type=cv2.NORM_L1)
# 归一化后范围是 0~1,但最大值不是1,所以这里乘以一个足够大的数,你也可以取其它值,不一定是下面这个数。注意到 np.uint8 的最大值是255,因此 re-scale 的范围也是 0~255
cv2.imshow("NORM_L1", np.uint8(dst*20000000))
# NORM_L2,2范数,每个值除以该向量的模长,归一化位单位向量
dst = np.zeros(gray.shape, dtype=np.float32)
cv2.normalize(gray, dst=dst, alpha=1.0, beta=0, norm_type=cv2.NORM_L2)
# 与NORM_L1类似
cv2.imshow("NORM_L2", np.uint8(dst*30000))
cv2.waitKey(0)
cv2.destroyAllWindows()