• 十八、图像像素类型转换和归一化操作


    项目功能实现:对一张图像进行类型转换和归一化操作
    按照之前的博文结构来,这里就不在赘述了

    一、头文件

    norm.h

    #pragma once
    
    #include
    
    using namespace cv;
    
    class NORM {
    public:
    	void norm(Mat& image);
    };
    
    #pragma once
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    二、函数实现

    norm.cpp

    Ⅰ,像素类型转换

    image.convertTo(image, CV_32FC3);
    将image(第一个)转换为CV_32FC3类型,最终输出为image(第二个)

    对于数据类型而言,其结构为:CV_(S|U|F)C
    例如:CV_32FC3 细分:CV_ 32 F C3
    32表示每个像素点值所占32bit
    F表示Float单精度浮点数
    C3表示4通道图像,为啥呢?C表示通道数,C1是单通道、C2是三通道、C3是四通道,多了一个alpha透明度通道,PNG格式里面就有alpha通道
    当然也可以省略,默认为C1

    其实就三个参数而已,总结一下

    参数一(CV_32FC3)参数二(CV_32FC3)参数三(CV_32FC3) 该参数可省略,默认为C1
    8S:signed int,有符号整形C1:单通道
    16U:unsigned int,无符号整形C2:三通道
    32F: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
    #include
    
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、主函数

    yy_main.cpp

    #include 
    #include 
    #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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    项目结构如下:
    在这里插入图片描述

    运行结果如下:
    在这里插入图片描述
    因为是纯白色的背景,归一化效果不太明显

  • 相关阅读:
    预训练word2vec
    《canvas》之第13章 事件操作
    智能终端信息安全概念(十):内核安全(2)SElinux
    异常检测 | MATLAB实现基于支持向量机和孤立森林的数据异常检测(结合t-SNE降维和DBSCAN聚类)
    数据库概述05(数据库查询及修改操作)
    区块链资源协同配置系统动力学预测模拟研究——以粤港澳大湾区为例
    SpringBoot自动配置原理
    响应式 API:核心
    Linux进程控制【概念 + 代码演示】
    java获取中文拼音
  • 原文地址:https://blog.csdn.net/qq_41264055/article/details/136226289