欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

OpenCV中的像素归一化

OpenCV 迷途小书童 2年前 (2022-07-16) 1480次浏览 0个评论

归一化就是把数据经过处理后限制在某个特定范围内。归一化的目的,是将没有可比性的数据变得具有可比性,同时又保持着之间的相对关系。

opencv 中使用 normalize 方法来实现归一化,它的函数原型如下

cv2.normalize(src, dst, alpha=None, beta=None, norm_type=None, dtype=None, mask=None)

其中:

  • src: 输入矩阵
  • dst: 输出矩阵, 与输入矩阵形状相同
  • alpha: 如果 norm_typeNORM_MINMAX,则 alpha 为大值或小值;如果 norm_type 为其他类型时,则为归一化要乘的系数
  • beta: 如果 norm_typeNORM_MINMAX,则 beta 为小值或大值,和 alpha 对应;如果 norm_type 为其他类型,beta 被忽略,一般传入0
  • norm_type: 归一化类型,常见的有 NORM_MINMAXNORM_INFNORM_L1NORM_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()

opencv normalization

参考资料

喜欢 (0)

您必须 登录 才能发表评论!