2019-07-29 17:24:21 nanhuaibeian 阅读数 1401
  • 【Python】第16周 数据挖掘与机器学习进阶(上)

    本周课程讲机器学习的概念,了解什么是机器学习以及机器学习的主要任务,kNN算法、线性回归算法的原理与实现,如何拆分训练数据集与测试数据集,算法中的超参数以及特征归一化等内容。实战部份,将讲解手写字体识别和房价预测。

    640 人正在学习 去看看 CSDN就业班

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

归一化的原因

  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
在这里插入图片描述

2019-06-20 23:23:59 kingkee 阅读数 590
  • 【Python】第16周 数据挖掘与机器学习进阶(上)

    本周课程讲机器学习的概念,了解什么是机器学习以及机器学习的主要任务,kNN算法、线性回归算法的原理与实现,如何拆分训练数据集与测试数据集,算法中的超参数以及特征归一化等内容。实战部份,将讲解手写字体识别和房价预测。

    640 人正在学习 去看看 CSDN就业班

一、编程环境:

OpenCV  4.1.0
IDE Visual Studio 2017 Enterprise (15.9.13)
操作系统 Windows 10 x64 中文专业版 (1903)

二、归一化:

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

首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。

归一化的具体作用是归纳统一样本的统计分布性。

归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。

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

三、归一化的方式:(在 base.hpp 中定义)

在 OpenCV 4.1.0 中定义了 9 种方式:

enum NormTypes {
                 NORM_INF       = 1,
                 NORM_L1        = 2,
                 NORM_L2        = 4,
                 NORM_L2SQR     = 5,
                 NORM_HAMMING   = 6,
                 NORM_HAMMING2  = 7,
                 NORM_TYPE_MASK = 7, 
                 NORM_RELATIVE  = 8,
                 NORM_MINMAX    = 32 
               };

四、OpenCV 归一化函数:normalize()

void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
                int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());

五、示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char *argv[])
{
	Mat src = imread("../images/test.png");
	if (src.empty()) {
		printf("不能加载图片!\n");
		return -1;
	}
	namedWindow("1--原图", WINDOW_AUTOSIZE);
	imshow("1--原图", src);

	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	// 转换为浮点数类型数组
	gray.convertTo(gray, CV_32F);

	// 归一化:NORM_MINMAX
	Mat dst = Mat::zeros(gray.size(), CV_32FC1);
	normalize(gray, dst, 1.0, 0, NORM_MINMAX);
	Mat result = dst * 255;
	result.convertTo(dst, CV_8UC1);
	imshow("2--NORM_MINMAX", dst);

	// 归一化:NORM_INF
	normalize(gray, dst, 1.0, 0, NORM_INF);
	result = dst * 255;
	result.convertTo(dst, CV_8UC1);
	imshow("3--NORM_INF", dst);

	// 归一化:NORM_L1
	normalize(gray, dst, 1.0, 0, NORM_L1);
	result = dst * 10000000;
	result.convertTo(dst, CV_8UC1);
	imshow("4--NORM_L1", dst);

	// 归一化:NORM_L2
	normalize(gray, dst, 1.0, 0, NORM_L2);
	result = dst * 10000;
	result.convertTo(dst, CV_8UC1);
	imshow("5--NORM_L2", dst);

	waitKey(0);
	return 0;
}

六、运行效果:

2019-01-17 17:53:20 qq_34814092 阅读数 365
  • 【Python】第16周 数据挖掘与机器学习进阶(上)

    本周课程讲机器学习的概念,了解什么是机器学习以及机器学习的主要任务,kNN算法、线性回归算法的原理与实现,如何拆分训练数据集与测试数据集,算法中的超参数以及特征归一化等内容。实战部份,将讲解手写字体识别和房价预测。

    640 人正在学习 去看看 CSDN就业班

Java OpenCV-4.0.0 图像处理09 图像的上采样和降采样及归一化

Java OpenCV-4.0.0 图像处理 图像的上采样和降采样及归一化

归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。
归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。
归一化的目的,是使得没有可比性的数据变得具有可比性,同时又保持相比较的两个数据之间的相对关系,如大小关系;或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等。


/**
 * OpenCV-4.0.0 图片上采样(放大)
 * @return: void  
 * @date: 2019年5月7日12:16:55
 */
public static void zoomIn() {
	Mat src=Imgcodecs.imread("C:\\Users\\Administrator\\Pictures\\99.png");
	Mat dst=new Mat();
	Imgproc.pyrUp(src,dst,new Size(src.cols()*2,src.rows()*2));
	HighGui.imshow("图片上采样(放大)", dst);
	HighGui.waitKey(0);
}

/**
 * OpenCV-4.0.0 图片降采样 (缩小)
 * @return: void  
 * @date: 2019年5月7日12:16:55
 */
public static void zoomOut() {
	Mat src=Imgcodecs.imread("C:\\Users\\Administrator\\Pictures\\99.png");
	Mat dst=new Mat();
	Imgproc.pyrDown(src,dst,new Size(src.cols()/2,src.rows()/2));
	HighGui.imshow("图片降采样 (缩小)", dst);
	HighGui.waitKey(0);
}

/**
 * OpenCV-4.0.0 图片归一化
 * @return: void  
 * @date: 2019年5月7日12:16:55
 */
public static void normalize() {
	Mat src=Imgcodecs.imread("C:\\Users\\Administrator\\Pictures\\99.png");
	Mat gray=new Mat();
	Mat image1=new Mat();
	Mat image2=new Mat();
	Mat mask=new Mat();
	Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
	Imgproc.GaussianBlur(gray, image1, new Size(3,3), 0);
	Imgproc.GaussianBlur(image1, image2, new Size(3,3), 0);
	Core.subtract(image1, image2, mask, new Mat());
	Core.normalize(mask, mask,255,0,Core.NORM_MINMAX);
	HighGui.imshow("图片归一化", mask);
	HighGui.waitKey(0);
}

图片归一化

2014-08-28 11:02:09 zhouyelihua 阅读数 17765
  • 【Python】第16周 数据挖掘与机器学习进阶(上)

    本周课程讲机器学习的概念,了解什么是机器学习以及机器学习的主要任务,kNN算法、线性回归算法的原理与实现,如何拆分训练数据集与测试数据集,算法中的超参数以及特征归一化等内容。实战部份,将讲解手写字体识别和房价预测。

    640 人正在学习 去看看 CSDN就业班

相关的论文中英文的:http://download.csdn.net/detail/zhouyelihua/7832193 



 图像的归一化在计算机视觉当中,很多时候都作为一个预处理进行处理的。因为图像的归一化保持了仿射不变性。而且图像的归一化有时候能够提高计算的精度。

所以图像的归一化对于我们来说很重要。

而图像的归一化的具体过程主要是:

      1.坐标中心化

     2.x-shearing 归一化、

3.缩放归一化

4.旋转归一化

而在上述当中的四步骤其实就是针对仿射变化而进行的。

   因为一个仿射变化可以化为位移变化 切向变化 缩放变化 旋转变化的组合的。

区域f(x,y)对应的p+q矩是:


.

而我们定义的其中心矩为:



定义图像的协方差矩阵M为





我们可以得到:



其中x‘’‘和y’‘’是变化后的位置,而x,y是初始的位置。

而这个变换过程从右到左就是我们上述的四步骤:坐标中心化,x,y方向的拉伸,缩放变化,旋转变化。











2013-03-01 11:03:33 UnilVision 阅读数 3727
  • 【Python】第16周 数据挖掘与机器学习进阶(上)

    本周课程讲机器学习的概念,了解什么是机器学习以及机器学习的主要任务,kNN算法、线性回归算法的原理与实现,如何拆分训练数据集与测试数据集,算法中的超参数以及特征归一化等内容。实战部份,将讲解手写字体识别和房价预测。

    640 人正在学习 去看看 CSDN就业班

本文介绍3种基本的字符形状归一化算法(Character Shape Normalization)。字符归一化是光学字符识别中的一个子步骤,给定一个字符区域,我们要做的就是将该区域内的字符归一化到一个标准模板大小,然后才能提取特征,并送给分类器做具体的识别。好的归一化算法可以尽量提高后续特征提取在同一类内的一致性。

先来看一个例子,假如上帝拥有一个完美的字符归一化算法,那么他将可以做到如下所示的效果:

图1,完美的归一化:左边为原始字符区域,右边为归一化后的结果。

如果说我们能做到上述结果,那么也就无需再做特征提取,也无需再做训练,而只需简单的模板匹配即可得到100%准确的分类结果。可以看到,上述算法的能力在于:

1. 归一化到标准模板大小

2. 倾斜校正

3. 笔画宽度归一化

4. 字形归一化


可惜的是,今天介绍的几种常见算法仅能保证第1点的实现,而2,3则只能实现部分。至于4,就让后续的特征提取去弥补吧。言归正传,3个算法分别是:线性归一化算法,基于图像矩的归一化以及非线性归一化算法。


按惯例,3个算法的标准c实现可在:

https://github.com/UnilVision/visionbase/tree/master/ocr/baseline/normalization找到。希望对大家有所帮助。


线性归一化:线性归一化算法就是一个标准的线性采样过程,采用线性插值获得最终的图像结果。在我们的实现中,使用反向计算的方式:

其中为长和宽的比值。

对应代码中的函数为:

void backward_linear(unsigned char* src, int src_wid, int src_hei, int src_widstep,
					 CHARECT_t* region,
					 unsigned char* dst, int dst_wid, int dst_hei, int dst_widstep,
					 int ratio_preserve_func);

图像矩归一化: 我们可以通过图像矩来预先校正字符的倾斜度,并通过矩来获得字体的实际大小[w1, h1]及中心位置[xc, yc]。归一化的原始区域被修改为

[xc-w1/2, xc+w1/2, yc-h1/2, yc+h1/2]。其计算方法为:


是一个经验值,一般取4。


其中图像矩的计算方法:



在找到新的区域[xc-w1/2, xc+w1/2, yc-h1/2, yc+h1/2]后,后续即调用线性归一化算法即可。对应代码中的实现为:

void backward_moment(unsigned char* src, int src_wid, int src_hei, int src_widstep,
					 CHARECT_t* region,
					 unsigned char* dst, int dst_wid, int dst_hei, int dst_widstep,
					 int ratio_preserve_func);


图像矩倾斜校正:利用图像矩,我们可以找到字符的倾斜角

采样计算方式为:


注意这里我们仅调整x的位置以保证图像的中心仍然处于原始的xc,yc。其实现对于:

// slant correction
// Note>> (dst_wid, dst_hei) must equal to (region.width, region.height)
void backward_moment_slantcorrection(unsigned char* src, int src_wid, int src_hei, int src_widstep,
				     CHARECT_t* region,
				     unsigned char* dst, int dst_wid, int dst_hei, int dst_widstep);

通常倾斜校正会放在归一化之前,已获得更好的效果。


非线性归一化:这里实现的是Jun Tsukumo在1988年提出的一个经典算法(原论文名称为Classification of Handprinted Chinese Characters Using Non-linear Normalization and Correlation Methods)。作者的思路是希望每一行,每一列的背景区域都可以平均分布。

为此,他首先为每个像素在x,y方向分别定义了个概率密度函数:以及。这两个函数的计算方法是:

如果(x,y)是一个属于字符区域的像素,那么都取一个极小值(在我们的实现中,这个值是0.001f,调整这个参数可以引起归一化后笔画的粗细变化)。

如果(x,y)是背景区域像素,那么:



其中分别是当前像素所处x方向背景像素的run-length和y方向的run-length。有了这两个密度函数,定义:



这里px和py就是归一化后的投影直方图了,为了在归一化后的图像中让px和py平均分布,引入两个函数hx,hy:



通过前向映射采样即可实现归一化操作:



注意这里与前两个算法的不同之处,前向映射是将当前图像的某个像素映射到归一化的图像中。而反向映射则是将归一化的图像中的某个像素位置映射到原图像中。

非线性归一化的实现对应:

void forward_nonlinear_1d(unsigned char* src, int src_wid, int src_hei, int src_widstep,
						  CHARECT_t* region,
						  unsigned char* dst, int dst_wid, int dst_hei, int dst_widstep,
						  int ratio_preserve_func);

参考结果

最后看下各个算法的结果:


图2,参考结果。从左到右依次:1. 原始扣取的图像通过OpenCV的resize函数缩放。2. 线性归一化。3.基于矩的归一化。4.先倾斜校正再基于矩的归一化。5.非线性归一化。


[原创文章,转载请注明出处:http://blog.csdn.net/unilvision/article/details/8624606]




图像的归一化

阅读数 632

字符归一化

阅读数 6338

没有更多推荐了,返回首页