图像处理中归一化如何处理

2019-07-03 23:24:51 qq_18741601 阅读数 364

matlab图像处理为什么要归一化和如何归一化,
一、为什么归一化
1.
 基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响。也就是转换成唯一的标准形式以抵抗仿射变换
  图像归一化使得图像可以抵抗几何变换的攻击,它能够找出图像中的那些不变量,从而得知这些图像原本就是一样的或者一个系列的。
  因为我们这次的图片有好多都是一个系列的,所以老师把这个也作为我研究的一个方向。
  我们主要要通过归一化减小医学图片由于光线不均匀造成的干扰。
2.matlab里图像数据有时候必须是浮点型才能处理,而图像数据本身是0-255的UNIT型数据所以需要归一化,转换到0-1之间。
3.归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。 目的是为了:
(1).避免具有不同物理意义和量纲的输入变量不能平等使用
(2).bp中常采用sigmoid函数作为转移函数,归一化能够防止净输入绝对值过大引起的神经元输出饱和现象
(3).保证输出数据中数值小的不被吞食
3.神经网络中归一化的原因
归一化是为了加快训练网络的收敛性,可以不进行归一化处理
归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1–+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一化是同一在0-1之间的统计概率分布; 当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。
归一化是因为sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.9 0.1 0.1]就要比用[1 0 0]要好。
但是归一化处理并不总是合适的,根据输出值的分布情况,标准化等其它统计变换方法有时可能更好。

二、如何归一化
matlab中的归一化处理有三种方法

  1. premnmx、postmnmx、tramnmx
  2. restd、poststd、trastd
  3. 自己编程
    (1)线性函数转换,表达式如下:
    y=(x-MinValue)/(MaxValue-MinValue)
    说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。
    (2)对数函数转换,表达式如下:
    y=log10(x)
    说明:以10为底的对数函数转换。
    (3)反余切函数转换,表达式如下:
    y=atan(x)*2/PI
    (4)一个归一化代码.
    I=double(I);
    maxvalue=max(max(I)’);%max在把矩阵每列的最大值找到,并组成一个单行的数组,转置一下就会行转换为列,再max就求一个最大的值,如果不转置,只能求出每列的最大值。
    f = 1 - I/maxvalue; %为什么要用1去减?
    Image1=f;
2019-11-08 22:19:59 xjp_xujiping 阅读数 1016

二:图像归一化处理

图像归一化最常见的就是最大最小值归一化方法,公式如下:

  1. OpenCV中实现图像最大与最小值归一化的函数如下:
  2. normalize(
  3. src, // 表示输入图像, numpy类型
  4. dst, // 表示归一化之后图像, numpy类型
  5. alpha=None, // 归一化中低值 min
  6. beta=None, // 归一化中的高值max
  7. norm_type=None, // 归一化方法,选择最大最小值归一化 NORM_MINMAX,
  8. dtype=None, // 归一化之后numpy数据类型,一般选择cv.CV_32F
  9. mask=None //遮罩层,默认设置为None
  10. )

基于OpenCV实现图像最大最小值归一化的代码演示如下:

  1. image = cv.imread("D:/javaopencv/dahlia_4.jpg")
  2. cv.imshow("input", image)
  3. result = np.zeros(image.shape, dtype=np.float32)
  4. cv.normalize(image, result, alpha=0, beta=1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
  5. print(result)
  6. cv.imshow("norm", np.uint8(result*255.0))
  7. cv.waitKey(0)
  8. cv.destroyAllWindows()

原图像素值输出

归一化之后像素值:

解释

原图与归一化之后的运行结果完全一致,说明归一化不会改变图像本身的信息存储,但是通过打印出来的像素值可以发现,取值范围从0~255已经转化为0~1之间了,这个对于后续的神经网络或者卷积神经网络处理有很大的好处,tensorflow官方给出mnist数据集,全部采用了归一化之后的结果作为输入图像数据来演示神经网络与卷积神经网络。

实验

image = cv2.imread(r"D:\test_picture\9.jpg")#uint8 (372,419,3) [[[252 246 233][252 246 233].........]]
cv2.imshow("input", image)
#print(image)
result = np.zeros(image.shape, dtype=np.float32)
#cv2.normalize(image, result, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
result = image/255.0 #与cv2.normalize效果一样
#result = image/127.5 - 1 #也是对图像进行归一化,范围为[-1, 1]
print(result)#float64 (372,419,3) [[[0.98823529 0.96470588 0.91372549] [0.98823529 0.96470588 0.91372549].....]]

img = np.uint8(result*255.0)#
print((image == img).all())#true 

cv2.imshow("norm",result)#result 和 img的显示效果一样,灰度图除以255就是进行以归一化处理,你可视化的时候会映射到图像空间的。
cv2.waitKey(0)
cv2.destroyAllWindows()

#im = Image.fromarray(result)#TypeError: Cannot handle this data type
#im.show()
  • 252 / 255 = 0.98823529

#result 和 img的显示效果一样,灰度图除以255就是进行以归一化处理,你可视化的时候会映射到图像空间的。

在代码中看到图像的2种处理方式:

img/255.0
img/127.5 - 1
第一种是对图像进行归一化,范围为[0, 1],第二种也是对图像进行归一化,范围为[-1, 1],这两种只是归一化范围不同,为了直观的看出2种区别,分别对图像进行两种处理:

1

从图中可以看出, 第二种方式图像显示的更黑,其直方图如下:

2

同样,其直方图的分布规律相同,第二种分布相对稀疏。

 

2014-05-11 16:41:27 u010555688 阅读数 26282

一、简介

图像归一化是计算机视觉、模式识别等领域广泛使用的一种技术。所谓图像归一化, 就是通过一系列变换, 将待处理的原始图像转换成相应的唯一标准形式(该标准形式图像对平移、旋转、缩放等仿射变换具有不变特性)。 近年来, 基于矩的图像归一化技术受到了人们的普遍关注, 其基本工作原理为: 首先利用图像中对仿射变换具有不变性的矩来确定变换函数的参数, 然后利用此参数确定的变换函数把原始图像变换为一个标准形式的图像(该图像与仿射变换无关)。  一般说来, 基于矩的图像归一化过程包括 4 个步骤 即坐标中心化、x-shearing 归一化、缩放归一化和旋转归一化。

基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响。也就是转换成唯一的标准形式以抵抗仿射变换。图像归一化使得图像可以抵抗几何变换的攻击,它能够找出图像中的那些不变量,从而得知这些图像原本就是一样的或者一个系列的。以下你要知道的:
1.归一化处理并没有改变图像的对比度
2.归一化处理很简单,假设原图像是8位灰度图像,那么读入的像素矩阵最大值为256,最小值为1,定义矩阵为I,J=I/256,就是归一化的图像矩阵,就是说归一化之后所有的像素值都在[0,1]区间内。

二、什么是归一化

归一化就是通过一系列变换(即利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响),将待处理的原始图像转换成相应的唯一标准形式(该标准形式图像对平移、旋转、缩放等仿射变换具有不变特性)。

基于矩的图像归一化技术基本工作原理为:首先利用图像中对仿射变换具有不变性的矩来确定变换函数的参数, 然后利用此参数确定的变换函数把原始图像变换为一个标准形式的图像(该图像与仿射变换无关)。 一般说来,基于矩的图像归一化过程包括4个步骤,即坐标中心化、x-shearing 归一化、缩放归一化和旋转归一化。

图像归一化使得图像可以抵抗几何变换的攻击,它能够找出图像中的那些不变量,从而得知这些图像原本就是一样的或者一个系列的。


三、为什么归一化

1.基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响。也就是转换成唯一的标准形式以抵抗仿射变换。图像归一化使得图像可以抵抗几何变换的攻击,它能够找出图像中的那些不变量,从而得知这些图像原本就是一样的或者一个系列的。

2.matlab里图像数据有时候必须是浮点型才能处理,而图像数据本身是0-255的UNIT型数据所以需要归一化,转换到0-1之间。

3.归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。目的是为了:

(1)避免具有不同物理意义和量纲的输入变量不能平等使用

(2)bp中常采用sigmoid函数作为转移函数,归一化能够防止净输入绝对值过大引起的神经元输出饱和现象

(3)保证输出数据中数值小的不被吞食

3.神经网络中归一化的原因:

归一化是为了加快训练网络的收敛性,可以不进行归一化处理;

归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一化是同一在0-1之间的统计概率分布;当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。

归一化是因为sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.9 0.1 0.1]就要比用[1 0 0]要好。

但是归一化处理并不总是合适的,根据输出值的分布情况,标准化等其它统计变换方法有时可能更好。


四、matlab图像处理如何归一化

matlab中的归一化处理有三种方法
1. premnmx、postmnmx、tramnmx、mapminmax

(1)premnmx函数用于将网络的输入数据或输出数据进行归一化,归一化后的数据将分布在[-1,1]区间内。

premnmx语句的语法格式是:[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T),其中P,T分别为原始输入和输出数据。

在训练网络时如果所用的是经过归一化的样本数据,那么以后使用网络时所用的新数据也应该和样本数据接受相同的预处理,这就要用到tramnmx函数:

(2)tramnmx语句的语法格式是:[PN]=tramnmx(P,minp,maxp)

其中P和PN分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。

网络输出结果需要进行反归一化还原成原始的数据,常用的函数是:postmnmx。

(3)postmnmx语句的语法格式是:[PN] = postmnmx(P,minp,maxp)

其中P和PN分别为变换前、后的输入数据,maxp和minp分别为premnmx函数找到的最大值和最小值。

(4)还有一个函数是mapminmax,该函数可以把矩阵的每一行归一到[-1 1].

mapminmax语句的语法格式是:[y1,PS] = mapminmax(x1)

其中x1 是需要归一的矩阵 y1是结果。

当需要对另外一组数据做归一时,就可以用下面的方法做相同的归一了

y2 = mapminmax('apply',x2,PS)

当需要把归一的数据还原时,可以用以下命令:

x1_again = mapminmax('reverse',y1,PS) 

1> 默认的map范围是[-1, 1],所以如果需要[0, 1],则按这样的格式提供参数:
  MappedData = mapminmax(OriginalData, 0, 1);
2> 只按行归一化,如果是矩阵,则每行各自归一化;
3> 如果需要对整个矩阵归一化,用如下方法:
  FlattenedData = OriginalData(:)'; % 展开矩阵为一列,然后转置为一行。
  MappedFlattened = mapminmax(FlattenedData, 0, 1); % 归一化。
  MappedData = reshape(MappedFlattened, size(OriginalData)); % 还原为原始矩阵形式。此处不需转置回去,因为reshape恰好是按列重新排序


2. restd、poststd、trastd


3. 自己编程
   三种归一化方法:
除以序列最大值的,叫峰归一化;
除以序列之和的,叫面积归一化;
除以序列的模,叫数值归一化,得到序列的方差为0,均值为1;
(1) 线性函数转换,表达式如下:
y=(x-MinValue)/(MaxValue-MinValue)
y=0.1+(x-min)/(max-min)*(0.9-0.1)(归一到0.1-0.9之间)
说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。
(2) 对数函数转换,表达式如下:
y=log10(x)
说明:以10为底的对数函数转换。
(3) 反余切函数转换,表达式如下:
y=atan(x)*2/PI
(4) Z-score标准化方法
这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:


其中为所有样本数据的均值,为所有样本数据的标准差。
(5)一个归一化代码.
    I = double(I);

    maxvalue = max(max(I)');

%max在把矩阵每列的最大值找到,并组成一个单行的数组,转置一下就会行转换为列,再max就求一个最大的值,如果不转置,只能求出每列的最大值。

f = 1 - I/maxvalue; %为什么要用1去减?
    Image1 = f;


图片标准化通常是一个整体概念,要求把图片归一到均值为0,方差为1的情况下。这个概念类识于一般正态分布向标准正态分布的转化:

          (image-Mean)/Variance    其中, Mean和 Variance分别为矩阵的均值和方差。

matlab code:

function [image] = ImageNormalize(Image)

Image=double(Image);

mean_val = mean(Image(:));

varian_val = var(Image(:));

normalized_X = (Image-mean_val)/varian_val;

image =normalized_X;


 参考:http://blog.csdn.net/yihaizhiyan/article/details/6696912

http://blog.sina.com.cn/s/blog_675eb4fd01012chi.html

http://blog.sina.com.cn/s/blog_4aee288a0100ibt3.html

2015-11-25 09:51:28 zengjiqin 阅读数 23748

http://blog.sciencenet.cn/blog-444691-322182.html  此文来自科学网张建国博客

http://www.cnblogs.com/LBSer/p/4440590.html

matlab图像处理为什么要归一化和如何归一化
一、为什么归一化
1.
    基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响。也就是转换成唯一的标准形式以抵抗仿射变换
  图像归一化使得图像可以抵抗几何变换的攻击,它能够找出图像中的那些不变量,从而得知这些图像原本就是一样的或者一个系列的。
  因为我们这次的图片有好多都是一个系列的,所以老师把这个也作为我研究的一个方向。
  我们主要要通过归一化减小医学图片由于光线不均匀造成的干扰。
2.matlab里图像数据有时候必须是浮点型才能处理,而图像数据本身是0-255的UNIT型数据所以需要归一化,转换到0-1之间。
3.归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。 目的是为了:
(1).避免具有不同物理意义和量纲的输入变量不能平等使用 
(2).bp中常采用sigmoid函数作为转移函数,归一化能够防止净输入绝对值过大引起的神经元输出饱和现象 
(3).保证输出数据中数值小的不被吞食 
3.神经网络中归一化的原因
        归一化是为了加快训练网络的收敛性,可以不进行归一化处理 
        归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,归一化是同一在0-1之间的统计概率分布; 当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于0或与其均方差相比很小。
        归一化是因为sigmoid函数的取值是0到1之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。所以这样做分类的问题时用[0.9 0.1 0.1]就要比用[1 0 0]要好。
但是归一化处理并不总是合适的,根据输出值的分布情况,标准化等其它统计变换方法有时可能更好。

二、如何归一化
matlab中的归一化处理有三种方法
1. premnmx、postmnmx、tramnmx
2. restd、poststd、trastd
3. 自己编程
(1)线性函数转换,表达式如下:
y=(x-MinValue)/(MaxValue-MinValue)
说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。
(2)对数函数转换,表达式如下:
y=log10(x)
说明:以10为底的对数函数转换。
(3)反余切函数转换,表达式如下:
y=atan(x)*2/PI
(4)一个归一化代码.
I=double(I);
maxvalue=max(max(I)');%max在把矩阵每列的最大值找到,并组成一个单行的数组,转置一下就会行转换为列,再max就求一个最大的值,如果不转置,只能求出每列的最大值。
f = 1 - I/maxvalue; %为什么要用1去减?
Image1=f;

机器学习模型需要对数据进行归一化

1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度

1 归一化为什么能提高梯度下降法求解最优解的速度?

如下图所示,蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],其所形成的等高线非常尖。当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;

      而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。

      因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。

2 归一化有可能提高精度

一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

3 归一化的类型

1)线性归一化

x' = \frac{x - \text{min}(x)}{\text{max}(x)-\text{min}(x)}

      这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。

2)标准差标准化

  经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:

  其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

3)非线性归一化

     经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。





2019-07-29 17:24:21 nanhuaibeian 阅读数 5934

归一化
就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。

归一化的原因

  1. matlab里图像数据有时候必须是浮点型才能处理,而图像数据本身是 0-255 的 uint8 型数据,所以需要归一化,转换到 0-1之间。
  2. 在许多图像处理系统中,对图像进行归一化都是必备的预处理过程。一般而言,对于灰度图像(或彩色通道的每个颜色分量)进行灰度归一化就是:使其像素的灰度值分布在0~255之间,避免图像对比度不足(图像像素亮度分布不平衡)从而对后续处理带来干扰。
  3. 例如一个double类数组包含区间[0,255]之外的值,则使用B = uint8(A)转换时,MATLAB会将所有小于0的值转换为0,所有大于255的值转换为255,而在0和255之间的值将全部舍去小数部分转换为整数。因此需要对其进行适当地缩放
  4. 防止跨度过大,把边缘像素抹掉

示例 1

>> g = [-0.5 0.5;0.75 1.5]
g =
   -0.5000    0.5000
    0.7500    1.5000
% 将矩阵 g 构成的图像转换为 uint8 型
>> g1 = im2uint8(g)
g1 =
  2×2 uint8 矩阵
     0   128
   191   255
% 将矩阵 g 构成的图像先归一化处理,然后转换为 uint8 型
>> g2 = im2uint8(mat2gray(g))
g2 =
  2×2 uint8 矩阵
     0   128
   159   255

由结果可以看出,不归一化处理,对图像的灰度(介于黑白之间的颜色)或多或少有影响。
示例 2
在这里插入图片描述