5.12图像归一化

目录

实验原理

示例代码1

运行结果1

示例代码2

convertScaleAbs

运行结果2


实验原理

在OpenCV中,normalize函数用于对图像或矩阵进行归一化处理。归一化是一种重要的预处理步骤,可以应用于多种计算机视觉和图像处理任务中。归一化的主要目的是将数据映射到一个特定的范围内,从而使得数据更容易处理和比较。

归一化的作用

1. 标准化数据:将图像或特征向量的值映射到一个固定的范围(如[0, 1]或[-1, 1]),便于后续处理。

2. 提高数值稳定性:在进行数学运算时,避免因数据范围过大而导致的数值溢出或下溢问题。

3. 增强对比度:通过调整图像的动态范围,增强图像的对比度。

4. 减少噪声影响:归一化可以减少图像中的噪声对后续处理的影响。

5. 特征提取:在特征提取和匹配中,归一化可以使特征更加稳定,提高匹配的准确性。

6. 模型训练:在机器学习和深度学习中,归一化输入数据可以加速模型训练过程,并提高模型的泛化能力。

归一化的常见应用场景

1. 图像处理:

•直方图均衡化:在直方图均衡化之后,可以使用归一化来限制像素值在一定的范围内。

•对比度增强:通过归一化调整图像的动态范围,增强图像的对比度。

•图像融合:在图像融合(如多曝光图像融合)中,归一化可以使得不同图像之间的像素值更加一致。

2. 特征提取和匹配:

•SIFT/SURF/ORb等特征描述子:在特征描述子计算过程中,归一化可以使特征描述子的值更加稳定。

•特征匹配:在特征匹配时,归一化可以提高匹配的准确性和鲁棒性。

3. 机器学习和深度学习:

•输入数据预处理:在训练机器学习或深度学习模型时,归一化输入数据可以加速收敛速度,并提高模型的泛化能力。

•损失函数计算:在计算损失函数时,归一化可以使得损失值更加稳定,避免梯度爆炸或消失问题。

函数原型

void normalize(const InputArray src, OutputArray dst, 
    double alpha=1, double beta=0, int normType=NORM_L2, 
    int rtype=-1, InputArray mask=noArray());
void normalize(const SparseMat& src, SparseMat& dst, double alpha, 
    int normType);

参数说明
InputArray src:源数组。可以是任意类型的数组,如图像矩阵。
OutputArray dst:目标数组,与 src 具有相同的大小。
double alpha:归一化后的范数值或值范围的下界(对于范围归一化)。在范数归一化中,alpha 表示归一化后的范数值。
double beta:值范围的上界(对于范围归一化)。在范数归一化中,beta 参数不起作用。
int normType:归一化类型。不同的归一化类型有不同的效果,常见的类型包括 NORM_INF、NORM_L1 和 NORM_L2。
int rtype:目标数组的数据类型。当 rtype 为负数时,目标数组具有与 src 相同的类型。否则,目标数组具有与 src 相同的通道数,深度由 CV_MAT_DEPTH(rtype) 决定。
InputArray mask:可选的操作掩码。如果提供了掩码,只有掩码中非零的部分才会参与归一化操作。

归一化类型说明
NORM_INF:无穷范数归一化,即最大绝对值归一化。每个元素都被除以矩阵中的最大绝对值。
NORM_L1:L1范数归一化,即每个元素都被除以所有元素绝对值的和。
NORM_L2:L2范数归一化,即每个元素都被除以所有元素平方和的平方根。

示例代码1

下面是一个使用 normalize 函数进行归一化的示例:

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
	// 读取图像
	Mat img = imread("A1.png", IMREAD_COLOR);
	if (img.empty()) 
	{
		cerr << "无法加载图像,请检查文件路径是否正确。" << endl;
		return -1;
	}


	// 定义目标矩阵
	Mat gray;
	cvtColor(img, gray, COLOR_BGR2GRAY);//转化为灰度图像
	// 定义目标矩阵
	Mat imgNormalized;

	// 设置归一化参数
	double alpha = 1; // 归一化后的范数值
	double beta = 0;  // 范数归一化时不使用
	int normType = NORM_L2; // L2范数归一化

	// 应用归一化
	normalize(gray, imgNormalized, alpha, beta, normType);

	// 显示原始图像和归一化后的图像
	
	// 显示原始图像和变换后的图像
	namedWindow("源图像", WINDOW_NORMAL);
	imshow("源图像", img);

	namedWindow("灰度图像", WINDOW_NORMAL);
	imshow("灰度图像", gray);


	namedWindow("归一化后图像", WINDOW_NORMAL);
	imshow("归一化后图像", imgNormalized);



	waitKey(0); // 等待按键退出

	return 0;
}

代码说明
1.读取图像:使用 imread 函数读取图像,并确保图像路径正确。
2.定义目标矩阵:创建一个目标矩阵 imgNormalized,它将存储归一化后的图像。
3.设置归一化参数:定义归一化参数 alpha, beta, normType。
4.应用归一化:使用 normalize 函数对图像进行归一化。
5.显示结果:使用 imshow 函数显示原始图像和归一化后的图像,并等待用户按键退出。

总结
归一化是一种重要的图像处理技术,它可以改善图像的对比度,使得图像更适合进一步的处理。通过调整归一化参数,可以灵活地控制归一化的效果。在OpenCV中,normalize 函数提供了一种方便的方式来实现这一技术。

运行结果1

示例代码2

在OpenCV中,normalize函数用于调整图像的像素值,使其满足特定的分布,比如将所有像素值缩放到一个指定的范围内。当您使用L2范数归一化时,每个像素值会被转换成相对于整个图像像素强度的比重。这意味着输出图像的像素值会变成浮点数,并且通常不是直观的灰度值(0-255范围内的整数)。因此,归一化后的图像可能看起来是灰色的,即使它包含了从0.0到1.0的完整动态范围。

如果您希望归一化后的图像仍然具有良好的对比度并能够清晰地显示细节,您可以考虑将归一化后的图像重新缩放到0到255之间的整数,这样就可以用标准的8位灰度图像来显示了。

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
	// 读取图像
	Mat img = imread("A2.png", IMREAD_COLOR);
	if (img.empty()) {
		cerr << "无法加载图像,请检查文件路径是否正确。" << endl;
		return -1;
	}

	// 转化为灰度图像
	Mat gray;
	cvtColor(img, gray, COLOR_BGR2GRAY);

	// 定义目标矩阵
	Mat imgNormalized, imgNormalized8U;

	// 设置归一化参数
	double alpha = 1.0; // 可以调整亮度
	double beta = 0.0;  // 可以调整对比度
	int normType = NORM_MINMAX; // 将图像数据缩放到min和max之间
	double min = 0.0; // 最小像素值
	double max = 255.0; // 最大像素值

	// 应用归一化
	normalize(gray, imgNormalized, alpha, beta, normType, CV_32F, Mat());
	// 将32位浮点数转换为8位无符号整数
	convertScaleAbs(imgNormalized, imgNormalized8U, 255.0 / (alpha + beta), 0);

	// 显示原始图像和归一化后的图像
	namedWindow("源图像", WINDOW_NORMAL);
	imshow("源图像", img);

	namedWindow("灰度图像", WINDOW_NORMAL);
	imshow("灰度图像", gray);

	namedWindow("归一化后图像", WINDOW_NORMAL);
	imshow("归一化后图像", imgNormalized8U);

	waitKey(0); // 等待按键退出

	return 0;
}

在这个版本的代码中,NORM_MINMAX归一化类型被用来将像素值缩放到最小值和最大值之间,这里设置为0到255。然后使用convertScaleAbs函数将归一化的32位浮点数图像转换为适合显示的8位无符号整数图像。这样,归一化后的图像将以标准的灰度级显示。

convertScaleAbs

convertScaleAbs()函数是OpenCV中的一个函数,用于按比例缩放图像,并将结果转换为绝对值,最终存储为8位整数类型的图像。这个函数非常有用,特别是在处理归一化后的图像时,因为归一化过程可能会产生浮点数,而我们通常需要的是可以显示的标准8位灰度或彩色图像。

convertScaleAbs()函数的基本语法如下:

void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)

参数说明:

src:输入图像,可以是单通道或多通道图像,每个通道可以是8U、16U、32S、32F或64F类型。
dst:输出图像,与输入图像有相同的大小和通道数。
alpha:缩放系数,默认值为1,意味着不进行缩放。
beta:加到缩放后的像素值上的加数,默认值为0。

当您使用normalize()函数对图像进行归一化之后,如果得到的是浮点数格式的图像,那么可以使用convertScaleAbs()将其转换为8位无符号整数格式,以便于显示或进一步处理。

例如,在之前的代码中,我们使用了convertScaleAbs()来将归一化后的图像转换为8位灰度图:
normalize(gray, imgNormalized, alpha, beta, NORM_MINMAX, CV_32F, Mat());
convertScaleAbs(imgNormalized, imgNormalized8U, 255.0 / (alpha + beta), 0);

这里的alpha和beta是在normalize()调用中使用的参数,它们控制着归一化后的图像的亮度和对比度。在convertScaleAbs()调用中,我们使用255.0 / (alpha + beta)作为缩放因子,这通常是为了确保图像的值能正确映射到0到255之间。

请注意,如果alpha和beta在归一化过程中保持默认值(即alpha = 1 和 beta = 0),则缩放因子将简单地是255.0,因为归一化后的图像值已经在0到1之间。如果alpha和beta被调整过,则需要根据实际值调整缩放因子,以确保正确的映射。

运行结果2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值