【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所示 ...
随机推荐
- mysql关键字匹配度模糊查询
有时候项目中需要进行模糊查询,但是要对查询出来的结果进行匹配度排序,比如搜索关键字是"北",需要把数据库中第一个字是北的排在前面,此时就可以用mysql的INSTR函数. INST ...
- 二叉树(binary tree)
二叉树(binary tree) 二叉树(Binary Tree)是一种常见的树状数据结构,它由一组节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点.二叉树具有以下特点: 每个节点最多有 ...
- SSMS 显示行号
SSMS 显示行号 SSMS2022--工具--选项--文本编辑器--所有语言--常规--勾选"行号"--确定.
- 「codeforces - 687D」Dividing Kingdom II
link. 好题啊. 首先有一个类 kruskal 暴力,就是对于每一个询问,把所有边按权值大小排降序,第一个加进去成为奇环的边就是答案.注意我们不需要关注偶环长成什么样子,所以我们实际上维护的是一棵 ...
- Llama2-Chinese项目:4-量化模型
一.量化模型调用方式 下面是一个调用FlagAlpha/Llama2-Chinese-13b-Chat[1]的4bit压缩版本FlagAlpha/Llama2-Chinese-13b-Chat-4 ...
- CF1676G
题目简化和分析: 求一颗子树的黑白两数是否相等. 我们设黑 \(1\),白 \(-1\),若某一棵子树的权值为 \(0\),说明此刻的黑白个数相等,贡献加一. 从根搜索,每次将值传递给父亲,判断父亲此 ...
- CF1338A
题目简化和分析: \(a_{i}\ge a_{i-1}\) 已经满足直接跳过 \(a_{i}<a_{i-1}\) 我们就要将其的差进行二进制的分解,使得 \(a_{i-1}=a_i\) 我也不知 ...
- CompletableFuture异步优化代码
CompletableFuture异步编排优化代码 我们在项目开发中,有可能遇到一个接口需要调用N个服务的接口.比如用户请求获取订单信息,需要调用用户信息.商品信息.物流信息等接口,最后再汇总数据统一 ...
- 文心一言 VS 讯飞星火 VS chatgpt (118)-- 算法导论10.3 3题
三.用go语言,在ALLOCATE-OBJECT和 FREE-OBJECT过程的实现中,为什么不需要设置或重置对象的 prev 属性呢? 文心一言: 在 Go 语言中,ALLOCATE-OBJECT ...
- 哪一个更好?Spring boot还是Node.js
前言 本篇文章有些与众不同,由于我自己手头有些关于这个主题的个人经验,受其启发写出此文.虽然SpringBoot和Node.js服务于很不一样的场景,但是这两个框架共性惊人.其实每种语言都有不计其数的 ...