项目功能实现:对一张图像进行类型转换和归一化操作
按照之前的博文结构来,这里就不在赘述了
一、头文件
norm.h
#pragma once
#include<opencv2/opencv.hpp>
using namespace cv;
class NORM {
public:
void norm(Mat& image);
};
#pragma once
二、函数实现
norm.cpp
Ⅰ,像素类型转换
image.convertTo(image, CV_32FC3);
将image(第一个)转换为CV_32FC3类型,最终输出为image(第二个)
对于数据类型而言,其结构为:CV_<bit_depth>(S|U|F)C<number_of_channels>
例如:CV_32FC3 细分:CV_ 32 F C3
32表示每个像素点值所占32bit
F表示Float单精度浮点数
C3表示4通道图像,为啥呢?C表示通道数,C1是单通道、C2是三通道、C3是四通道,多了一个alpha透明度通道,PNG格式里面就有alpha通道
当然也可以省略,默认为C1
其实就三个参数而已,总结一下
参数一(CV_32 FC3) | 参数二(CV_32F C3) | 参数三(CV_32FC3 ) 该参数可省略,默认为C1 |
---|---|---|
8 | S:signed int,有符号整形 | C1:单通道 |
16 | U:unsigned int,无符号整形 | C2:三通道 |
32 | F:float,单精度浮点型 | C3:四通道,多了一个alpha通道 |
64 | ||
表示每个像素点值所占的bit位 |
Ⅱ,归一化
normalize(image, result, 1.0, 0, NORM_MINMAX);
参数一:处理对象为image
参数二:输出结果为result
参数三:alpha
参数四:beta
参数五:不同归一化操作,包括:NORM_L1、NORM_L2、NORM_INF、NORM_MINMAX
NORM_L1:
1,求解image图片中所有像素点绝对值之和sum
2,result[0,0] = (alpha * image[0,0]) / sum
,得到result的第一个像素值,以此类推得到result图像
NORM_L2:
1,求解image图片中各像素点值的平方和的开方sum(也就是L2-范数)
2,result[0,0] = (alpha * image[0,0]) / sum
,得到result的第一个像素值,以此类推得到result图像
NORM_INF:
1,求解image图片中所有像素点值最大的那个max
2,result[0,0] = (alpha * image[0,0]) / max
,得到result的第一个像素值,以此类推得到result图像
NORM_MINMAX:
1,alpha和beta系统会自动判断出最大值和最小值,分别赋值为max和min
2,根据公式计算出result的每个像素点的值
#include"norm.h"
#include<iostream>
#include<opencv2/opencv.hpp>
void NORM::norm(Mat& image) {
Mat result;
std::cout << image.type() << std::endl;
image.convertTo(image, CV_32FC3);
std::cout << image.type() << std::endl;
normalize(image, result, 1.0, 0, NORM_MINMAX);
std::cout << result.type() << std::endl;
imshow("norm",result);
}
三、主函数
yy_main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include "norm.h"
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = cv::imread("E:/C++_workspace/beyond.jpg", IMREAD_COLOR);
if (src.empty()) {
printf("load image is false...\n");
return -1;
}
namedWindow("yanyu", WINDOW_FREERATIO);
imshow("yanyu", src);
NORM yy;
yy.norm(src);
waitKey(0);
destroyAllWindows();
return 0;
}
项目结构如下:
运行结果如下:
因为是纯白色的背景,归一化效果不太明显