图像处理入门系列文章

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  60static 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.图像正规化前后效果

正规化前:

正规化后:


总结

需要用实际图像测试。

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

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

    图像处理入门 C语言生成RGB24格式图像 图像缩放之最近邻内插法 图像直方图均衡化数学原理和程序实现 目录 图像处理入门 一.图像均衡化数学原理 1.转化为数学问题 2.需要用到的知识 3.数学推理 ...

  2. Zhang-Suen 图像骨架提取算法的原理和OpenCV实现

    记录一下图像骨架提取算法,转载至 两种图像骨架提取算法的研究(1)原理部分 基于OpenCV的实现代码如下,代码部分参考 opencv骨架提取/图像细化 void thinImage(Mat & ...

  3. 【OpenCV】对比度增强之直方图正规化(归一化)

    原理详解: 假设输入图像为I,高为H.宽为W,I(r,c)代表I的第r行第c列的灰度值,将I中出现的最小灰度级记为Imin,最大灰度级记为Imax,即I(r,c)ϵ[Imin,Imax]\epsilo ...

  4. 《OpenCV3编程入门》学习笔记9 直方图与匹配(一二) 图像直方图概述直方图的计算与绘制

    第9章 直方图与匹配 9.1 图像直方图(Histogram)概述 1.作用:   在每个兴趣点设置一个有相近特征的直方图所构成的标签,通过标记帧与帧之间显著的边缘.颜色.角度等特征的统计变化,来检测 ...

  5. python图像直方图与直方图均衡化

    图像直方图以及灰度与彩色图像的直方图均衡化 图像直方图: 图像的直方图用来表征该图像像素值的分布情况.用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目 ...

  6. OpenCV与图像处理学习二——图像直方图与色彩空间

    OpenCV与图像处理学习二--图像直方图与色彩空间 2.4 图像直方图(Image Histogram) 2.4.1 直方图的绘制 2.4.2 三通道直方图绘制 2.5 颜色空间 2.5.1 RGB ...

  7. 基于python的对比度增强(线性变换、直方图正规化、直方图均衡化、CLAHE)

    线性变换 假设输入图像为I,宽为W,高为H,输出图像为O,图像的线性变换可以用以下公式定义: O(r,c)=a×I(r,c)+b,0≤r<H,0≤c<WO(r, c) = a × I(r, ...

  8. 【数字图像处理】图像直方图均衡化、空域滤波(均值滤波、中值滤波)、图像锐化(Laplace算子)、图像傅里叶变换实验

    图像直方图均衡化.空域滤波.图像锐化.图像傅里叶变换 一.图像直方图均衡化 二.图像空域滤波 1.均值滤波(滤波次数n→3) 2.中值滤波(滤波次数n→3) 3.图像锐化(Laplace算子) 三.图 ...

  9. OpenCV 【九】——calcHist ——图像直方图统计

    calcHist() 计算直方图实现(C++.opencv) 1.作用: 图像直方图是对数据集合的一种统计方法,将统计结果分布于一系列预定义的bin中,bin是直方图中经常用到的一个概念,其数值是从数 ...

最新文章

  1. Mac下sublime text2 解决中文乱码
  2. 在IIS6上部署WebService
  3. 刚发现的,免费领取1024G云空间
  4. lwbt的内存分配详解
  5. How applications are staged in SAP Cloud Platform CloudFoundry environment
  6. cf1555C Coin Rows
  7. 天气模式_北方降雪骤减!南方开启湿冷模式多阴雨!|天气展望
  8. 下班到点想走,但老员工都没动,怎么办?
  9. ssh 登录时,有的服务器很容易频繁断开连接,有的却几乎不会断开。
  10. 如何进行网站性能优化
  11. 转 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法
  12. [Qt扒手2] PyQt5 路径绘画例子
  13. Excel如何快速将一维表转为二维表
  14. nps内网穿透工具学习
  15. 上古卷轴5:重制版窗口化运行1920*1080画面显示不全的问题解决
  16. 摊牌了!我要手写一个“Spring Boot”
  17. 基于PLC的智能化远程养殖监控系统
  18. 计算机考试从哪里如何出题,计算机基础考试系统出题-第4章 excel.xls
  19. Markdown 中的表格合并单元格
  20. NXP JN5189 ZigBee 3.0开发环境搭建

热门文章

  1. ISDN, ADSL的历史新闻
  2. uniapp本地存储(uni.setStorageSync和uni.setStorage)
  3. python-turtle函数
  4. 什么是2014年互联网上“风口的猪”?
  5. php多维数组合并_两种PHP二维数组合并的方式
  6. 基于Java+MySQL实现(Web)在线题库管理系统【100010067】
  7. ubuntu16.04 安装nominatim 实现离线逆地理解析服务
  8. Ubuntu启动黑屏解决方案
  9. App Store 上架被拒的那些坑儿
  10. Vue +ElementUI +Baidu地图 项目模板