convertTo()
和 normalize()
是两个常用的图像处理函数,用于图像像素类型转换和归一化;convertTo()
函数用于将一个 cv::Mat
对象的像素类型转换为另一种类型。它的基本用法如下:void cv::Mat::convertTo(
OutputArray m,
int rtype,
double alpha = 1,
double beta = 0
) const;
参数解释:
m:输出的目标图像;
rtype:目标图像的数据类型(可以使用 OpenCV 提供的常量如CV_8U、CV_16U、CV_32F等);
alpha:缩放因子,用于线性变换。默认为1;
beta:偏移量,用于线性变换。默认为0;
示例:
cv::Mat img = cv::imread("input.jpg");
cv::Mat new_img;
img.convertTo(new_img, CV_32F); // 将图像转换为32位浮点数类型
normalize()
函数用于将图像的像素值归一化到指定的范围内,通常是 [0, 1] 或 [0, 255]。void cv::normalize(
InputArray src,
OutputArray dst,
double alpha = 0,
double beta = 255,
int norm_type = NORM_L2,
int dtype = -1,
InputArray mask = noArray()
);
参数解释:
src:输入图像;
dst:输出归一化后的图像;
alpha:归一化的下界;
beta:归一化的上界;
norm_type:归一化类型,默认为NORM_L2(
NORM_MINMAX
NORM_INF
NORM_L1
NORM_L2
)
dtype:输出图像的数据类型(默认值-1,如果为负数,将使用输入图像的数据类型) ;
mask:掩码,可选参数;
示例:
cv::Mat img = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat normalized_img;
cv::normalize(img, normalized_img, 0, 255, cv::NORM_MINMAX, CV_8U);
在这个示例中,normalize() 函数将图像的像素值归一化到 [0, 255] 的范围内,并将结果保存在 normalized_img 中。
总的来说,convertTo()
用于更改图像的数据类型,而 normalize()
用于将像素值归一化到指定范围内。这两个函数在图像处理中经常会用到,可以根据具体的需求来选择使用。
#include
#include
int main() {
// 读取图像
cv::Mat img = cv::imread("input.jpg");
if (img.empty()) {
std::cerr << "Could not read the image." << std::endl;
return -1;
}
// 转换前的像素数据类型CV_8UC3
std::cout << img.type() << std::endl;
// 将图像从当前类型转换为新的类型CV_32FC3
cv::Mat new_img;
img.convertTo(new_img, CV_32F); // 这里将图像转换为32位浮点数类型,可以使用 CV_8U、CV_16U、CV_32F 等来选择不同的目标类型
// 转换后的像素数据类型
std::cout << new_img.type() << std::endl;
// 进一步处理 new_img ...
return 0;
}
将像素值归一化到[0, 1]范围:
#include
#include
int main() {
// 读取灰度图像
cv::Mat img = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
if (img.empty()) {
std::cerr << "Could not read the image." << std::endl;
return -1;
}
// 将像素值转换为浮点数类型并归一化
cv::Mat normalized_img;
img.convertTo(normalized_img, CV_32F);
normalized_img /= 255.0;
// 进一步处理 normalized_img ...
return 0;
}
将像素值归一化到[0, 255]范围:
#include
#include
int main() {
// 读取灰度图像
cv::Mat img = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
if (img.empty()) {
std::cerr << "Could not read the image." << std::endl;
return -1;
}
// 将像素值转换为整数类型并归一化
cv::Mat normalized_img;
img.convertTo(normalized_img, CV_8U);
normalized_img *= 255;
// 进一步处理 normalized_img ...
return 0;
}
将像素值归一化到[0, 1]范围:
#include
#include
int main() {
// 读取灰度图像
cv::Mat img = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
if (img.empty()) {
std::cerr << "Could not read the image." << std::endl;
return -1;
}
// 将像素值转换为浮点数类型并归一化
cv::Mat normalized_img;
cv::normalize(img, normalized_img, 0.0, 1.0, cv::NORM_MINMAX, CV_32F);
// 进一步处理 normalized_img ...
return 0;
}
将像素值归一化到[0, 255]范围:
#include
#include
int main() {
// 读取灰度图像
cv::Mat img = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
if (img.empty()) {
std::cerr << "Could not read the image." << std::endl;
return -1;
}
// 将像素值归一化到[0, 255]范围
cv::Mat normalized_img;
cv::normalize(img, normalized_img, 0, 255, cv::NORM_MINMAX, CV_8U);
// 进一步处理 normalized_img ...
return 0;
}
convertTo()
和 normalize()
这两个函数都可以用来对图像进行归一化,但它们的具体用途略有不同:
convertTo()
函数用于将一个 cv::Mat
对象的像素类型转换为另一种类型,它可以用于进行不同类型之间的转换,包括归一化。例如,可以将图像从8位无符号整数转换为32位浮点数类型,也可以将像素值映射到特定范围内。normalize()
函数专门用于将图像的像素值归一化到指定的范围内,通常是 [0, 1] 或 [0, 255]。这是一种特定于归一化的函数,通常用于数据预处理等情况。两者可以根据实际需要来选择使用,但请注意它们的不同用途和参数。如果你只需要进行简单的归一化操作,那么 normalize()
可能更为直观和方便。如果需要进行更复杂的类型转换,包括将图像从一种类型转换为另一种类型,那么 convertTo()
可能更为适合。