1. 学习目标
- 学习 OpenCV 图像像素的类型转换;
- 学习 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 值计算公式
-
NORM_L1 : 归一化数组的(曼哈顿距离)L1-范数(绝对值的和)
-
NORM_L2 : 归一化数组的(欧几里德距离)L2-范数(平方和的开方)
-
NORM_INF : 归一化数组的(切比雪夫距离)L∞-范数(绝对值的最大值)
-
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 输出第一个像素不同方式的归一化后的值
文章来源:https://www.toymoban.com/news/detail-448055.html
5. 总结
- 归一化是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
- 理解归一化不同计算方式的过程。
6. 参考
- opencv中归一化函数normalize()的原理讲解
- 对比度增强(二):直方图正规划与伽马变换 cv.normal()函数使用及原理
- 学习【英特尔 OpenCV 初级认证课程-图像像素类型转换与归一化】
7. 说明
其中计算公式的图片直接使用的是opencv中归一化函数normalize()的原理讲解中的图片,如果不允许使用,请联系我,我会删除该部分内容!谢谢!文章来源地址https://www.toymoban.com/news/detail-448055.html
到了这里,关于OpenCV-Python学习(17)—— OpenCV 图像像素类型转换与归一化(cv.normalize)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!