IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 图像直方图正规化(Normalization)数学原理和纯C语言实现 -> 正文阅读

[C++知识库]图像直方图正规化(Normalization)数学原理和纯C语言实现

图像处理入门系列文章

C语言生成RGB24格式图像纯C语言实现

图像缩放之最近邻内插法数学原理和纯C语言实现

图像直方图均衡化(Equalization)数学原理和纯C语言实现

图像直方图规定化(Specification)数学原理和纯C语言实现

图像直方图正规化(Normalization)数学原理和纯C语言实现


目录

图像处理入门系列文章

一、图像正规化数学原理

1.转化为数学问题

2.需要用到的知识

3.数学推理

二、程序实现

1.程序实现原理

2.代码实现

3.程序执行效果

4.图像正规化前后效果

总结


一、图像正规化数学原理

1.转化为数学问题

? ? ? ??

2.需要用到的知识

????????一维函数微积分
????????随机变量的概率分布

3.数学推理

?????????

二、程序实现

1.程序实现原理

2.代码实现

代码如下(示例):

#include <stdlib.h>
#include <stdio.h>
 
 
#define PICT_WIDTH  90
#define PICT_HEIGHT  60
 
 
static unsigned int s_rgb[PICT_WIDTH][PICT_HEIGHT][3] = { 0 };
 
/**
* rgb24
* r:203 g:64,173,38 b:142
*/
int make_rgb24_colorbar(unsigned int rgb[90][60][3])
{
	int i = 0;
	int j = 0;
	unsigned char chr = 0;
 
	for (j = 0; j<PICT_HEIGHT; j++)
	{
		for (i = 0; i < PICT_WIDTH; i++)
		{
			if (i<30) 
			{
				chr = 203;
			}
			else if (i<60) 
			{
				chr = 64;
			}
			else 
			{
				chr = 0;
			}
			rgb[i][j][0] = chr;
 
			if (i<30)
			{
				chr = 0;
			}
			else if (i<60)
			{
				chr = 173;
			}
			else
			{
				chr = 0;
			}
			rgb[i][j][1] = chr;
 
			if (i<30)
			{
				chr = 0;
			}
			else if (i<60)
			{
				chr = 38;
			}
			else
			{
				chr = 142;
			}
			rgb[i][j][2] = chr;
		}
	}
	return 0;
}
 
int generate_rgb24_file(unsigned int rgb[90][60][3],char *file_name)
{
	char file_path[64] = {0};
	if (file_name == NULL) 
	{
		return 0;
	}
	snprintf(file_path,63,"rgb_%s_90_60.rgb24", file_name);
	FILE *fp = fopen(file_path, "wb+");
	int i = 0;
	int j = 0;
	unsigned char chr = 0;
 
	for (j = 0; j< PICT_HEIGHT; j++)
	{
		for (i = 0; i < PICT_WIDTH; i++)
		{
			chr = rgb[i][j][0];
			fwrite(&chr, 1, 1, fp);
 
			chr = rgb[i][j][1];
			fwrite(&chr, 1, 1, fp);
 
			chr = rgb[i][j][2];
			fwrite(&chr, 1, 1, fp);
		}
	}
	fclose(fp);
	return 0;
}
 
#define IMAGE_COLOR_LEVEL 256
 
#define HISTOGRAM_HEIGHT_MAX 20
#define HISTOGRAM_WIDTH_MAX 128
 
#define STATISTIC_DEC_MAX 5
#define STATISTIC_HOR_AXS_NUM (HISTOGRAM_WIDTH_MAX / STATISTIC_DEC_MAX)
 
int print_histogram(int image_statistic[IMAGE_COLOR_LEVEL],char *name)
{
	int *image_point = image_statistic;
	char hist_char = '*';
	char hist_space_char = ' ';
	char disp_array[HISTOGRAM_HEIGHT_MAX][HISTOGRAM_WIDTH_MAX + 1] = {0};
	int hist_statistic[HISTOGRAM_WIDTH_MAX] = {0};
	int i = 0;
	int j = 0;
	int k = 0;
	int statistic_max = 0;
	int hist_hor_axis[STATISTIC_HOR_AXS_NUM] = { 0 };
 
	for (i = 0; i < IMAGE_COLOR_LEVEL; i++)
	{
		hist_statistic[i * HISTOGRAM_WIDTH_MAX / IMAGE_COLOR_LEVEL] += image_statistic[i];
	}
 
	for (i = 0; i < STATISTIC_HOR_AXS_NUM; i++)
	{
		hist_hor_axis[i] = 1.0 * STATISTIC_DEC_MAX * i * IMAGE_COLOR_LEVEL / HISTOGRAM_WIDTH_MAX;
	}
 
	for (i = 0; i < HISTOGRAM_WIDTH_MAX; i++)
	{
		if (hist_statistic[i] > statistic_max)
		{
			statistic_max = hist_statistic[i];
		}
	}
 
 
	for (i = 0; i < HISTOGRAM_WIDTH_MAX;i++)
	{
		int hist_height = statistic_max == 0 ? 0 : hist_statistic[i] * HISTOGRAM_HEIGHT_MAX / statistic_max;
		for (j = 0; j < HISTOGRAM_HEIGHT_MAX; j++)
		{
			if (j < hist_height)
			{
				disp_array[j][i] = hist_char;
			}
			else
			{
				disp_array[j][i] = hist_space_char;
			}
		}
	}
 
	printf(
		"     y\n"
		"      \n"
		"     |\n"
		"%5d|\n", statistic_max);
	for (i = 0; i < HISTOGRAM_HEIGHT_MAX; i++)
	{
		printf(
		"     |%s\n", disp_array[HISTOGRAM_HEIGHT_MAX - i - 1]);
	}
	printf(
		"     |--------------------------------------------------------------------------------------------------------------------------------->x\n");
	printf(
		"     ");
	char dec_max[32] = { 0 };
	char format_str[32] = "%-";
	sprintf(dec_max, "%d", STATISTIC_DEC_MAX);
	strncat(format_str, dec_max,32);
	strncat(format_str, "d", 32);
	for (i = 0; i < STATISTIC_HOR_AXS_NUM; i++)
	{
		printf(
			format_str, hist_hor_axis[i]);
	}
	printf(
		"\n");
		
	if(name != NULL)
	{
		int name_size = strlen(name);
		if(name_size < HISTOGRAM_WIDTH_MAX)
		{
			int space = (HISTOGRAM_WIDTH_MAX - name_size) / 2;
			for (i = 0; i < space; i++)
			{
				printf(" ");
			}
			printf("%s\n\n",name);
		}
		
	}	
	return 0;
}
 
int statistic_histogram(unsigned int rgb[90][60][3],int image_statistic[IMAGE_COLOR_LEVEL])
{
	int i = 0;
	int j = 0;
	int k = 0;
	for(i = 0; i < 90; i++)
	{
		for (j = 0; j < 60; j++) 
		{
			for (k = 0; k < 3; k++)
			{
				image_statistic[rgb[i][j][k]]++;
			}
		}
	}
	return 0;
}


//直方图正规化
int histogram_normalization(unsigned int rgb[90][60][3], unsigned int result_rgb[90][60][3],int des_min,int des_max)
{
	int image_statistic[IMAGE_COLOR_LEVEL] = {0};
	int image_statistic2[IMAGE_COLOR_LEVEL] = {0};
	int i = 0;
	int j = 0;
	int k = 0;
	int tmp = 0;
	int src_min = IMAGE_COLOR_LEVEL - 1;
	int src_max = 0;
 
	statistic_histogram(rgb, image_statistic);
	
	for (i = 0; i < IMAGE_COLOR_LEVEL; i++)
	{
		if(image_statistic[i] != 0)
		{
			printf("before,i:[%d],num:[%d]\n",i,image_statistic[i]);
		}
	}
	
	for (i = 0; i < IMAGE_COLOR_LEVEL; i++)
	{
		if(image_statistic[i] != 0)
		{
			if(src_max < i)
			{
				src_max = i;
			}
			
			if(src_min > i)
			{
				src_min = i;
			}
		}
	}
	
	printf("src_min:[%d],src_max:[%d],des_min:[%d],des_max:[%d]\n",src_min,src_max,des_min,des_max);
	
	for (i = 0; i < 90; i++)
	{
		for (j = 0; j < 60; j++)
		{
			for (k = 0; k < 3; k++)
			{
				result_rgb[i][j][k] = (unsigned int)(1.0 * rgb[i][j][k] * (des_max - des_min) / (src_max - src_min) 
					+ 1.0 * (src_max * des_min - src_min * des_max)/(src_max - src_min));
			}
		}
	}
 
	statistic_histogram(result_rgb, image_statistic2);
	
	for (i = 0; i < IMAGE_COLOR_LEVEL; i++)
	{
		if(image_statistic2[i] != 0)
		{
			printf("after,i:[%d],num:[%d]\n",i,image_statistic2[i]);
		}
	}
	
	return 0;
}
 
int main()
{
	int image_statistic[IMAGE_COLOR_LEVEL] = {0};
	make_rgb24_colorbar(s_rgb);
	generate_rgb24_file(s_rgb, "colorbar");
	statistic_histogram(s_rgb, image_statistic);
	
	printf("\n ");
	print_histogram(image_statistic,"source image histogram");
 
	unsigned int result_rgb[90][60][3];
	int result_statistic[IMAGE_COLOR_LEVEL] = { 0 };
	
	histogram_normalization(s_rgb, result_rgb,0,255);
	statistic_histogram(result_rgb, result_statistic);
	print_histogram(result_statistic,"destination image histogram");
	generate_rgb24_file(result_rgb,"specification");
	sleep(100);;
    return 0;
}
 

3.程序执行效果

4.图像正规化前后效果

正规化前:

正规化后:


总结

需要用实际图像测试。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 22:56:44  更:2021-07-14 22:57:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/27 7:00:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码