native2ascii不生效OpenCV中矩阵归⼀化函数normalize()的原理讲解及公式
C++Python代码实例
Table of Contents
函数原型
void cv::normalize ( InputArray src,
InputOutputArray dst,
double alpha = 1,
double beta = 0,
int norm_type = NORM_L2,
int dtype = -1,
InputArray mask = noArray()
)
笔者说明:这个函数的作⽤就是把需要处理的数据通过某种算法限制在你需要的⼀定范围内。
参数说明
不同norm_type下的计算公式
以数列{ 2.0, 6.0, 7.0, 8.0, 10.0 }为例, alpha=5, beta=100
NORM_L1
1.先求出norm
公式:L1_norm = ∥src1∥L1=∑I|src1(I)|,即各数的绝对值之和
norm = |2.0| + |6.0| + |7.0| + |8.0| + |10.0| = 33
2. 再求dst
公式:dst = alpha*src/L1_norm
dst[0] = 5 * 2.0/ 33 = 0.303
剩下的以此类推,具体结果请参考最后的代码输出表格。
NORM_L2
1.先求出norm
公式:L2_norm = 矩阵中各元素的平⽅和的开⽅(欧⼏⾥德)(L2-范数)
2. 再求dst
公式:dst = alpha*src/L2_norm
dst[0] = 5 * 2.0/ 15.906 = 0.629
剩下的以此类推,具体结果请参考最后的代码输出表格。
NORM_INF
1.先求出norm
INF_norm = 矩阵中所有元素的最⼤值max
以上数列中 max = 10
PS: 图⽚处理时可以使⽤函数 void minMaxLoc(...);求出
2. 再求dst
公式:dst = alpha*src/INF_norm
dst[0] = 5 * 2.0/ 10 = 1
调用函数如何递归调用剩下的以此类推,具体结果请参考最后的代码输出表格。
NORM_MINMAX
1. alpha、beta分别为归⼀化后的最⼩值、最⼤值
函数会⾃动判断哪个为最⼤值,最⼩值
2. 再求dst
公式如下:
b = max(alpha, beta)
a = min(alpha, beta)
alpha=5, beta=100
b = max(alpha, beta) = 100
a = min(alpha, beta) = 5
dst[0] = (100-5) * (2-2)/ (10-2) +5 = 2
dst[1] = (100-5) * (6-2)/ (10-2) +5 = 52.5
剩下的以此类推,具体结果请参考最后的代码输出表格。
参考⽂章
代码实例
#include <opencv2/opencv.hpp> //头⽂件
#include <iostream>
using namespace cv; //包含cv命名空间
using namespace std;
int main(int argc, char ** argv)
{
vector<double> positiveData = { 2.0, 6.0, 7.0, 8.0, 10.0 };
vector<double> normalizedData_l1, normalizedData_l2, normalizedData_inf, normalizedData_minmax; // Norm to probability (total count)
// sum(numbers) = 23.0
normalize(positiveData, normalizedData_l1, 5.0, 100.0, NORM_L1);
cout <<"*normalizedData_l1*:" << endl;
//method#1 C operatator[] - FASTEST
//cout << "\n*C operatator[]*:" << endl;
for (size_t i = 0; i < normalizedData_l1.size(); i++)
{
cout << normalizedData_l1[i] << ",\t";
}
//method#2 C iterator - 2nd fast
//cout << "*iterator*:" << endl;
//for (vector<double>::iterator pd= normalizedData_l1.begin(); pd != d();pd++)
//{
// cout << *pd << "\t";
//}
//method#3 at -- 3rd fast
//cout << "\n*at*:" << endl;
//for (size_t i = 0; i < normalizedData_l1.size(); i++)
/
/{
// cout << normalizedData_l1.at(i)<< ",\t";
//}
// Norm to unit vector: ||positiveData|| = 1.0
normalize(positiveData, normalizedData_l2, 5.0, 100.0, NORM_L2);
cout << "\n*normalizedData_l2*:" << endl;
python基础代码100例for (size_t i = 0; i < normalizedData_l2.size(); i++)
{
cout << normalizedData_l2[i] << ",\t";
下载silverlight}
// Norm to max element
normalize(positiveData, normalizedData_inf, 5.0, 100.0, NORM_INF);
cout << "\n*normalizedData_inf*:" << endl;
for (size_t i = 0; i < normalizedData_inf.size(); i++)
{
cout << normalizedData_inf[i] << ",\t";
}
// Norm to range [5.0;100.0]
input控件的属性有哪些// 2.0 0.0 (shift to left border)
// 8.0 0.75 (6.0/8.0)
// 10.0 1.0 (shift to right border)
normalize(positiveData, normalizedData_minmax, 5.0, 100.0, NORM_MINMAX);
cout << "\n*normalizedData_minmax*:" << endl;
for (size_t i = 0; i < normalizedData_inf.size(); i++)
{
cout << normalizedData_minmax[i] << ",\t";
}
cout << endl;
// 【3】等待任意按键按下
waitKey(0);
return 0;
}
代码输出
我对alpha, beta取了三种情况,输出结果如下:
alpha=1, beta=0
Original NORM_L1NORM_L2NORM_INF NORM_MINMAX
2.00 0.0606060610.1257389230.20
6.00 0.1818181820.3772167680.60.5
7.00 0.2121212120.4400862290.70.625
8.00 0.2424242420.5029556910.80.75
10.00 0.3030303030.62869461311
alpha=3, beta=7
Original NORM_L1NORM_L2NORM_INF NORM_MINMAX
2.00 0.1818181820.3772167680.63
6.00 0.545454545 1.131650304 1.85
7.00 0.636363636 1.320258688 2.1 5.5
8.00 0.727272727 1.508867072 2.46
10.00 0.909090909 1.8860838437
alpha=5, beta=100
Original NORM_L1NORM_L2NORM_INF NORM_MINMAX
2.00 0.303030.62869515
6.00 0.909091 1.88608352.5
7.00 1.06061 2.20043 3.564.375
8.00 1.21212 2.51478476.25
10.00 1.51515 3.143475100 Python代码使⽤normalize
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
import sys
if __name__ == '__main__':
if len(sys.argv) > 1:
src = cv2.imread(sys.argv[1], cv2.IMREAD_ANYCOLOR)
else:
print("Usage:python normalize.py imageFile")
cv2.imshow("src", src) # 显⽰图⽚
# 直⽅图归⼀化/正规化
switch语句用法举例说明
# ⽅法⼀:
# dst = alize(src, src, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) # ⽅法⼆:
dst = alize(src, None, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) cv2.imshow("dst", dst) # 显⽰图⽚
cv2.waitKey(0) # 等待⽤户输⼊,按任意键即可
图像输出
可以看出输出图像⽐原来的对⽐度有增强
笔者备注
如果选择NORM_MINMAX类型,通常将alpha设定为最⼩值,将beta设定为最⼤值。⽐如,需要将数据范围限定在[0, 400],可以这么使⽤
normalize(src, dst, 0, 400.0, NORM_MINMAX);
如果选择其他三种类型,beta设定为0,alpha按需求设定。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论