4

OpenCV中的像素归一化

 2 years ago
source link: https://xugaoxiang.com/2022/07/16/opencv-normalize/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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()
12e5d5cb43cfb855.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK