OpenCV4入门教程020:像素归一化 您所在的位置:网站首页 食铁兽道具 OpenCV4入门教程020:像素归一化

OpenCV4入门教程020:像素归一化

2024-07-11 19:15| 来源: 网络整理| 查看: 265

索引地址:系列索引

像素归一化

像素值归一化就是要把图片像素值数据经过某种算法限制在需要的一定范围内。归一化可以使没有可比性的数据变得具有可比性,同时保持相比较的数据之间的相对关系。OpenCV提供了四种图片像素归一化的方法:

L1归一化 : NORM_L1L2归一化 : NORM_L2INF归一化 : NORM_INFMINMAX归一化 : NORM_MINMAX(最常用)

使用的函数是normalize(),函数说明为:

12345678void normalize( InputArray src, //输入图片 InputOutputArray dst, //输出图片 double alpha = 1, //norm_type = NORM_MINMAX时下限 double beta = 0,//norm_type = NORM_MINMAX时上限,norm_type = NORM_INF时最大值 int norm_type = NORM_L2, int dtype = -1, //输出type与输入type相同 InputArray mask = noArray() );

下面以20,80,100三个像素值为例解释OpenCV中四种归一化的计算方法,由于归一化后为小数,因此将20,80,100转换成浮点型20.0,80.0,100.0以减小精度丢失。

L1归一化:NORM_L1

L1归一化依据所有像素值之和,用原始像素值除以所有像素值之和即为原始像素值归一化后的值。

例如对于20.0,80.0,100.0三个像素值,它们的和为20.0+80.0+100.0=200.0

20.0/200.0=0.120.0/200.0=0.180.0/200.0=0.480.0/200.0=0.4100.0/200.0=0.5

所以20.0,80.0,100.0经过L1归一化后的值分别为0.1,0.4,0.5。

L2归一化:NORM_L2

L2归一化依据于原始像素值组成的单位向量,用原始像素值除以所有原始像素值平方值之和的平方根即为原始像素值归一化后的值。

例如对于20.0,80.0,100.0三个像素值,它们的平方和为:20.0∗20.0+80.0∗80.0+100.0∗100.0=16800.0,开平方得129.61。

20.0/129.61=0.15420.0/129.61=0.15480.0/129.61=0.61780.0/129.61=0.617100.0/129.61=0.772

所以20.0,80.0,100.0经过L2归一化后的值分别为0.154,0.617,0.772。

INF归一化:NORM_INF

INF归一化依据于最大值,用原始像素值除以所有原始像素值中的最大值即为原始像素值归一化后的值。

例如对于20.0,80.0,100.0三个像素值,它们的最大值为100.0。

20.0/100.0=0.280.0/100.0=0.880.0/100.0=0.8100.0/100.0=1.0

所以20.0,80.0,100.0经过INF归一化后的值分别为0.2,0.8,1.0。

MINMAX归一化:NORM_MINMAX

INF归一化依据于最大值与最小值的差值(记为delta),用原始像素值除以所有原始像素值中的最大值即为原始像素值归一化后的值。

例如对于20.0,80.0,100.0三个像素值,它们的最小值min为20.0,最大值maxmax为100.0,则delta=max−min=100.0−20.0=80.0

所以

(20.0−min)/delta=(20.0−20.0)/80.0=0.0(80.0−min)/delta=(80.0−20.0)/80.0=0.75(80.0−min)/delta=(80.0−20.0)/80.0=0.75(100.0−min)/delta=(100.0−20.0)/80.0=1.0(100.0−min)/delta=(100.0−20.0)/80.0=1.0

所以20.0,80.0,100.0经过MINMAX归一化后的值分别为0.0,0.75,1.0。

测试代码1123456789101112131415161718192021222324252627282930313233343536373839404142434445#include#include#include

using namespace cv;using namespace std;

int main(int argc, char**argv){ vectora = {20,80,100}; vectora1(3); vectora2(3); vectora3(3); vectora4(3); cv::normalize(a, a1, 1, 0, NORM_L1); cv::normalize(a, a2, 1, 0, NORM_L2); cv::normalize(a, a3, 1, 0, NORM_INF); cv::normalize(a, a4, 1, 0, NORM_MINMAX);

cout



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有