OpenCV-Python学习(17)—— OpenCV 图像像素类型转换与归一化(cv.normalize)

1. 学习目标

  1. 学习 OpenCV 图像像素的类型转换;
  2. 学习 OpenCV 归一化函数。

2. OpenCV 图像像素的类型转换

由于【在 OpenCV-Python 中一切图像数据皆 numpy.array】,因此像素的类型转换可以直接使用 numpy 的类型转换方法。

2.1 将像素转换为 float32

import numpy as np
import cv2 as cv

def check_type():
  img = cv.imread('./images/squirrel_cls.jpg')
  print('img_type',np.dtype(img[0][0][0]))
  print('img_data',img[0][0][0])
  cv.imshow("img", img)

  # 图像像素的类型转换为float32
  img_float32 = np.float32(img)
  print('img_float32_type',np.dtype(img_float32[0][0][0]))
  print('img_float32_data',img_float32[0][0][0])
  cv.imshow("img_float32", img_float32)

  cv.waitKey(0)
  cv.destroyAllWindows()

if __name__ == "__main__":
  check_type()

2.2 数据输出结果

输入图片说明

2.3 图像输出结果

输入图片说明

3. 归一化(cv.normalize)

归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。

归一化的目的,是使得没有可比性的数据变得具有可比性,同时又保持相比较的两个数据之间的相对关系,如大小关系;或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等。

3.1 cv.normalize() 函数使用

cv.normalize(src[, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]]) → dst

3.2 参数说明

参数 说明
src 表示输入图像。
dst 表示输出图像。
alpha 表示在范围归一化的情况下,归一化的下限边界或下限边界的标准值。
beta 表示在范围归一化的情况下,归一化的上范围边界。
norm_type 表示归一化的类型。
dtype 表示当为负时,输出数组的类型与src相同;否则,它具有与src相同的通道数。

3.3 norm_type 值说明

说明
NORM_L1 表示图像矩阵中值的绝对值的和。
NORM_L2 表示图像矩阵中值的平方和的开方。
NORM_INF 表示图像矩阵中值的绝对值的最大值。
NORM_MINMAX 表示图像矩阵中的数值被平移或缩放到一个指定的范围,线性归一化。

3.4 norm_type 值计算公式

  1. NORM_L1 : 归一化数组的(曼哈顿距离)L1-范数(绝对值的和)

  2. NORM_L2 : 归一化数组的(欧几里德距离)L2-范数(平方和的开方)

  3. NORM_INF : 归一化数组的(切比雪夫距离)L∞-范数(绝对值的最大值)

  4. NORM_MINMAX : 归一化数组的数值被平移或缩放到一个指定的范围

3.5 归一化计算实例

输入图片说明

4. OpenCV 归一化实例代码

4.1 代码

import numpy as np
import cv2 as cv

def check_type():
  img = cv.imread('./images/squirrel_cls.jpg')
  cv.imshow("img", img)

  # 图像像素的类型转换为float32
  img_float32 = np.float32(img)
  cv.imshow("img_float32", img_float32)

  # 归一化 NORM_L1
  img_NORM_L1 = img_float32.copy()
  cv.normalize(img_float32,img_NORM_L1,1,0,cv.NORM_L1)
  print(img_NORM_L1[0][0])
  cv.imshow("img_NORM_L1", img_NORM_L1)

  # 归一化 NORM_L2
  img_NORM_L2 = img_float32.copy()
  cv.normalize(img_float32,img_NORM_L2,1,0,cv.NORM_L2)
  print(img_NORM_L2[0][0])
  cv.imshow("img_NORM_L2", img_NORM_L2)

  # 归一化 NORM_INF
  img_NORM_INF = img_float32.copy()
  cv.normalize(img_float32,img_NORM_INF,1,0,cv.NORM_INF)
  print(img_NORM_INF[0][0])
  cv.imshow("img_NORM_INF", img_NORM_INF)

  # 归一化 NORM_MINMAX
  img_NORM_MINMAX = img_float32.copy()
  cv.normalize(img_float32,img_NORM_MINMAX,1,0,cv.NORM_MINMAX)
  print(img_NORM_MINMAX[0][0])
  cv.imshow("img_NORM_MINMAX", img_NORM_MINMAX)

  cv.waitKey(0)
  cv.destroyAllWindows()

if __name__ == "__main__":
  check_type()

4.2 效果

输入图片说明

4.3 输出第一个像素不同方式的归一化后的值

输入图片说明

5. 总结

  1. 归一化是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
  2. 理解归一化不同计算方式的过程。

6. 参考

  1. opencv中归一化函数normalize()的原理讲解
  2. 对比度增强(二):直方图正规划与伽马变换 cv.normal()函数使用及原理
  3. 学习【英特尔 OpenCV 初级认证课程-图像像素类型转换与归一化】

7. 说明

其中计算公式的图片直接使用的是opencv中归一化函数normalize()的原理讲解中的图片,如果不允许使用,请联系我,我会删除该部分内容!谢谢!

猜你喜欢

转载自blog.csdn.net/m0_38082783/article/details/128343246