【C++】【图像处理】灰度直方图实现算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)
前情提要:本记录需要一定的C++和图像处理基础进行阅读。
图像处理算法学习记录:
Code:
1 void histCompute(BYTE*image, int width, int height)
2 {
3 //计算直方图
4 for (int n = 0; n < 256; n++) {
5 hist[n] = 0;
6 }
7 BYTE gray;
8 for (int i = 0; i < width; i++) {
9 for (int j = 0; j < height; j++) {
10 gray = image[i * width + height];
11 hist[gray]++;
12 }
13 }
14 }
一、histCompute函数参数定义解析:
1、image参数表示传入已经打开图像文件获取到的像素级。因为存储的是像素级,而像素级的取值范围是2^8也就是0~255(256),8bit = 1Byte,所以image被定义为Byte类型的指针。
2、width参数表示传入图像的宽度。
3、height参数表示传入图像的高度。
二、第一个for循环解析:
hist是一个已经定义好的Byte hist[256]的数组,hist将用于存储图像每个灰度级的个数。通过for循环将hist中所有的元素进行初始化为0。
三、gray变量解析:
gray参数用于接收0~255之间的灰度级,并且充当hist索引的作用,下述会更清晰的解释gray的用途。
四、嵌套for循环解析:
1、外层for循环是遍历图像的宽,内层for循环时遍历图像的高,因为图像是二维的,即:
| 0 | 3 | 1 |
| 9 | 2 | 3 |
| 4 | 5 | 0 |
如上图所示,这个一个3x3大小的一个灰度级分布,每个格子中的数字代表着这一位置的灰度级,而我们需要使用一维数组来存储这个二维图像的数据,所以如何完整的遍历出每个格子中的灰度级便是我们求取直方图的核心。
五、核心算法解析:
10 Line:gary = image[i * width + height];这段代码中的 i * width + height 便是我们的核心算法,将 i 定义为图像的宽,j 定义为图像的高,当我们需要获取灰度级=0的所在的位置时,即上图中的(0,0)我们带入一下 i 和 j ,也就是 0 * 3 + 0 = 0,此时我们就定位到了图像(0,0)这个位置,依次类推带入。
而image已经指向了图像所有的灰度级,所以此时image[i * width + height]则表示在该点上的值,也就是图像(0,0)这个位置上的灰度级。
gray变量此时已经被(0,0)这一点上的灰度级赋值也就是等于0,那么hist[gray]++则表示:hist[0]++,这个0此时的作用就是数组索引,所以gray即代表着一个点的灰度级,也代表着在hist这个数组中的索引,最后的++的作用则是累加图像中所有像素级等于0的位置的个数,如上图所示,(0,0)的值是0,(2,2)的值也是0,所以当 i=2, j=2的时候,gray=0,所以hist则+1。
至此,灰度直方图的算法理解完毕。
总结:灰度直方图核心点即,获取图像每个灰度级存在的个数
【C++】【图像处理】灰度直方图实现算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)的更多相关文章
- 基于FPGA的HDTV视频图像灰度直方图统计算法设计
随着HDTV的普及,以LCD-TV为主的高清数字电视逐渐进入蓬勃发展时期.与传统CRT电视不同的是,这些高清数字电视需要较复杂的视频处理电路来驱动,比如:模数转换(A/D Converter).去隔行 ...
- Opencv——灰度直方图
灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率. 如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用pro ...
- c#数字图像处理(三)灰度直方图
灰度直方图是灰度的函数,描述的是图像中具有该灰度级的像素的个数.如果用直角坐标系来表示,则它的横坐标是灰度级,纵坐标是该灰度出现的概率(像素的个数). using System; using Syst ...
- Atitit 图像处理30大经典算法attilax总结
Atitit 图像处理30大经典算法attilax总结 1. 识别模糊图片算法2 2. 相似度识别算法(ahash,phash,dhash)2 3. 分辨率太小图片2 4. 横条薯条广告2 5. 图像 ...
- 【图像处理笔记】SIFT算法原理与源码分析
[图像处理笔记]总目录 0 引言 特征提取就是从图像中提取显著并且具有可区分性和可匹配性的点结构.常见的点结构一般为图像内容中的角点.交叉点.闭合区域中心点等具有一定物理结构的点,而提取点结构的一般思 ...
- openCV中直方图均衡化算法的理解
直方图均衡化就是调整灰度直方图的分布,即将原图中的灰度值映射为一个新的值.映射的结果直观表现是灰度图的分布变得均匀,从0到255都有分布,不像原图那样集中.图像上的表现就是对比度变大,亮的更亮,暗的更 ...
- Python实现图像直方图均衡化算法
title: "Python实现图像直方图均衡化算法" date: 2018-06-12T17:10:48+08:00 tags: [""] categorie ...
- OpenCV-跟我一起学数字图像处理之直方图均衡化
从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 由于一些图像灰度的分布过于集中,这样会导致 ...
- 灰度直方图均衡化----python实现
直方图均衡化是使用图像直方图进行对比度调整的图像处理的方法. 该方法通常会增加许多图像的整体对比度,尤其是当图像的可用数据由接近的对比度值表示时. 通过这种调整,强度可以更好地分布在直方图上. 这允许 ...
- [转]SURF算法解析
SURF算法解析 一.积分图像 积分图像的概念是由Viola和Jones提出的.积分图像中任意一点(i,j)的值为原图像左上角到任意点(i,j)相应的对焦区域的灰度值的总和,其数学公式如图1所示 ...
随机推荐
- jQuery默认选中下拉框的某个值
$("#quaterSelect").val("0");//id为quaterSelect的下拉框默认选中value是0的option选项
- 【python爬虫】爬虫所需要的爬虫代理ip是什么?
前言 在进行爬虫程序开发时,经常会遇到访问被限制的网站,这时就需要使用代理 IP 来进行访问.本文将介绍代理 IP 的概念及使用方法,帮助读者更好地应对爬虫程序中的访问限制问题.同时,本文还将提供一些 ...
- 已发布:Oracle Database 23c 免费版 — 开发人员版!
注:甲骨文云技术公众号文章备份 2023/04/12. 翻译新闻稿. 1.新发布 Oracle Database 23c 免费版 - 开发人员版 在 Oracle CloudWorld 2022 上, ...
- ECS搭建FTP服务
实验云账号,创建资源后生成收起 子用户名称: u-7ngohee5@1111971854401817 子用户密码: Jp1Ho5Aj5Ek5Yx1P AK ID: LTAI5tGc6fVMJj44H4 ...
- PortAudio详解(2015年12月1日更新)
PortAudio详解 整理者:赤子玄心 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 1 简介 ...
- 入门篇-其之六-Java运算符(中)
祝所有程序员,1024节日快乐!!! 一.自增/自减运算符 假设有一个变量intValue的值为10,如果想让这个值加1,有哪些方式? 首先,我们可以使用最原始的方式: int intValue = ...
- 使用fontforge进行字体拆分
fontforge官方网站 游戏开发为了节省内存和资源下载量,需要把字体不用的字删掉,或者拆成多个字体逐级加载,批量操作用UI就比较难搞了,用fontforge搞起来比较顺手 安装fontforge后 ...
- Acwing周赛102
倍增 这是一道简单数论题 using namespace std; typedef long long LL; const int N = 1e5 + 10; int a[N], n; int div ...
- 在Map或者Collection的时候,不要用它们的API直接修改集合的内容(否则会出现 java.util.ConcurrentModificationException 异常)
http://www.iteye.com/topic/124788 http://www.blogjava.net/EvanLiu/archive/2008/08/31/224453.html
- SQL改写案例2
postgresql 并没有像 oracle .dm 有这么丰富的 hint,在不改 sql 的情况下能干预执行计划. 如果想学好 postgresql.kingbase.MySQL 的sql 调优 ...