图像处理入门系列文章

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

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

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

图像直方图规定化(Specification)数学原理和纯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_specification(unsigned int rgb[90][60][3], unsigned int result_rgb[90][60][3],int image_statistic_spec[IMAGE_COLOR_LEVEL])
{int image_statistic[IMAGE_COLOR_LEVEL] = {0};int i = 0;int j = 0;int k = 0;int tmp = 0;int pixel_num = 90 * 60 * 3;float ratio = 0;float equal_ratio[IMAGE_COLOR_LEVEL] = { 0 };int spec_acc = 0;int equal_map[IMAGE_COLOR_LEVEL] = {0};int spec_equal_map[IMAGE_COLOR_LEVEL] = {0};float equal_spec_ratio[IMAGE_COLOR_LEVEL] = { 0 };int spec_map[IMAGE_COLOR_LEVEL] = {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++){for (j = 0; j < i + 1; j++) {equal_ratio[i] += image_statistic[j] * 1.0 / pixel_num;}}//均衡化映射表for (i = 0; i < IMAGE_COLOR_LEVEL; i++){equal_map[i] = (unsigned int)(IMAGE_COLOR_LEVEL - 1) * equal_ratio[i];//printf("equal i:[%d],des:[%d]\n",i,equal_map[i]);}//目标分布归一化for (i = 0; i < IMAGE_COLOR_LEVEL; i++){spec_acc += image_statistic_spec[i];}//原分布求累计概率for (i = 0; i < IMAGE_COLOR_LEVEL; i++){for (j = 0; j < i + 1; j++) {equal_spec_ratio[i] += image_statistic_spec[j] * 1.0 / spec_acc;}}//均衡化映射表for (i = 0; i < IMAGE_COLOR_LEVEL; i++){spec_equal_map[i] = (unsigned int)(IMAGE_COLOR_LEVEL - 1) * equal_spec_ratio[i];//printf("spec_equal i:[%d],des:[%d]\n",i,spec_equal_map[i]);}//映射匹配for (i = 0; i < IMAGE_COLOR_LEVEL; i++){int diff = IMAGE_COLOR_LEVEL;int index = 0;for (j = 0; j < IMAGE_COLOR_LEVEL; j++){tmp = equal_map[i] - spec_equal_map[j] > 0 ? equal_map[i] - spec_equal_map[j] : spec_equal_map[j] - equal_map[i];if(tmp < diff){diff = tmp;index  = j;}}spec_map[i] = index;}//生成最终图像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)spec_map[rgb[i][j][k]];//printf("[%d][%d][%d][%d]\n",i,j,k,result_rgb[i][j][k]);}}}int image_statistic2[IMAGE_COLOR_LEVEL] = {0};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 };int image_statistic_spec[IMAGE_COLOR_LEVEL] = {8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,};print_histogram(image_statistic_spec,"expected image histogram");histogram_specification(s_rgb, result_rgb, image_statistic_spec);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.图像规定化前后效果

规定化前:

规定化后:


总结

需要用实际图像测试。

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

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

    图像处理入门系列文章 C语言生成RGB24格式图像纯C语言实现 图像缩放之最近邻内插法数学原理和纯C语言实现 图像直方图均衡化(Equalization)数学原理和纯C语言实现 图像直方图规定化(Sp ...

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

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

  3. Python实现图像直方图规定化(直方图匹配)-附完整代码

    以下内容需要直方图均衡化.规定化知识 均衡化:https://blog.csdn.net/macunshi/article/details/79815870 规定化:https://blog.csdn ...

  4. 【医学图像处理】 2 灰度直方图、图像二值化(阈值分割)

    文章目录 1 灰度直方图 1.1 直方图理解 1.2 直方图计算 1.3 直方图均衡化 1.3.1 全局均衡化 1.3.2 自适应(局部)均值化 2 图像二值化(阈值分割) 2.1 二值化理解 2.2 ...

  5. 根据MATLAB的histeq函数改写的运行在OpenCV下的直方图规定化C源码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 2016-6-8日用C++也实现了直方图规定化, ...

  6. 数字图像处理 直方图规定化 MATLAB实验

    一.原理 直方图规定化是使原图像灰度直方图变成规定形状的直方图而对图像做修正的增强方法. 二.步骤 ①读入原图像huafen.jpg,并显示图像及其直方图: ②读入参考图像rice.tif,并显示图像 ...

  7. matlab中调用histeq函数命令,根据MATLAB的histeq函数改写的运行在OpenCV下的直方图规定化源码!...

    据说,图像的直方图规定化比直方图均衡化用得更多,但是很奇怪的是OpenCV居然没有图像直方图规定化的源码!所以,我就有必要在OpenCV下写一个图像直方图规定化处理的函数,以方便将来使用. 我在网上找 ...

  8. 图像五值化与基于三值图像的车牌识别(1)

    庆祝2011年新年 张忠义 海口愚佬会教育科技有限公司 全文下载 www.yulaohui.com/color5_2/ 摘 要:      图像五值化是通过公式Y =(R+G)/2,将RGB空间映射到 ...

  9. 图像二值化处理(全局阈值 自适应阈值 手动阈值操作以及直方图画法)

    文章目录 图像二值化处理 二值化原理 API介绍 手动设置阈值 均值法 迭代法 自动设置阈值 直方图法 全局阈值法 OTSU法 三角形法 自适应阈值法 API 绘制图像直方图 图像二值化处理 二值化原 ...

  10. python直方图规定化_python用直方图规定化实现图像风格转换

    以下内容需要直方图均衡化.规定化知识 直方图均衡化应用: 图像直方图均衡化能拉伸灰度图,让像素值均匀分布在0,255之间,使图像看起来不会太亮或太暗,常用于图像增强: 直方图规定化应用: 举个例子,当 ...

最新文章

  1. PL-VINS:实时基于点线的单目惯导SLAM系统
  2. CMD命令,常驻内存的与外部的介绍 还有CMD格式化
  3. 当当网强烈谴责李国庆有关刘强东案言论
  4. Ubuntu中安装、生成、导入、导出、Python3虚拟环境
  5. 在运行Loaded runtime CuDNN library: 7103 (compatibility version 7100) but source was compiled with 7003
  6. 密立根油滴实验的计算机仿真实验报告,H-D光谱实验的计算机仿真
  7. Go 除了泛型外最值得期待的新功能,模糊测试
  8. make make install出现recipe for target 'install-binPROGRAMS' failed解决办法
  9. H5实现拍照及相册图片上传
  10. 【英语学习】【Level 08】U03 My Choice L5 The star that shines the brightest
  11. ArcSegment对象
  12. 简述直方图和柱形图的区别_如何区分直方图与柱形图
  13. open打开新窗口时的选项
  14. Mysql Sql语句令某字段值等于原值加上一个字符串
  15. windows 下rsync
  16. wince系统usb刷机工具_中兴B860AV1.2-S905L刷机救砖教程,喜欢的分享一下
  17. 红帽linux64系统下载,红帽Linux 8.0 iso-RHEL 8.0 64位下载|RHEL 8.0 64位 - 爱学府软件园...
  18. 决策树应用实例③——银行借贷模型
  19. 宋九九:怎么做好网站搜索引擎优化,企业网站如何seo优化?
  20. easyui是怎么实现批量删除的_怎么批量删除空间说说-easyui的datagrid实现批量删除...

热门文章

  1. python 实现 pdf 书签读取、批量写入
  2. 最流行的三大数据建模工具
  3. solidity教程(二)僵尸攻击人类
  4. spss实现主成分分析
  5. 全球各国语言代码缩写与国家对照表
  6. win7升级Internet Explorer 11 先决条件更新
  7. bat脚本一键配置java开发环境
  8. STM32串口接收以及发送大全
  9. MD4、MD5、SHA1、HMAC、HMAC_SHA1区别
  10. oracle 用户密码过期修改,Oracle用户登录密码过期的修改