【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数据库触发器讲解 [创建/删除/查询/select into]
刚学习实例完mysql触发器, 前来分享学习经验. 菜鸟装逼, 老鸟勿喷 先来认识一下有关触发器的一些关键词. 在使用触发器时, 这些关键词将被用到, 请记下它们的模样和用途(意思) cre ...
- FastGPT 接入飞书(不用写一行代码)
FastGPT V4 版本已经发布,可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景,例如联网谷歌搜索,操作数据库等等,功能非常强大,还没用过的同学赶紧去试试吧. 飞书相比同类产品算是 ...
- vue2实现数据聚合【scatter-clustering】组件封装
实现如下效果: 效果展示:https://code.juejin.cn/pen/7228568245148581943 如果不会请移步到官网的栗子,请点击查看 直接给大家上代码: 整体代码片段 1 & ...
- JUC并发编程(1)—CompletableFuture详解
@ 目录 CompletableFuture介绍 1.创建异步任务 2.CompletableFuture API ①. 获得结果和触发计算(get.getNow.join.complete) ②. ...
- Fisher线性判别分析(二分类)
LDA(Linear Discriminant Analysis)是一种经典的线性判别方法,又称Fisher判别 分析.该方法思想比较简单:给定训练集样例,设法将样例投影到一维的直线 上,使得同类样例 ...
- 在 Mac 上撰写和格式化备忘录-添加提醒-添加日历
在 Mac 上撰写和格式化备忘录 您可以撰写备忘录以及更改备忘录的格式,例如,更改字体大小或对齐方式,或者使文本变为粗体.如果您使用的是升级后的 iCloud 备忘录或者储存在您 Mac 上的备忘录, ...
- Pandas 读取 Excel 斜着读
读取 Excel 斜着读数据 import pandas as pd def read_sideling(direction, sheet_name, row_start, col_start, ga ...
- Kubernetes跨StorageClass迁移,切换Rainbond默认SC
基于主机安装或基于Kubernetes安装的 Rainbond 集群(均使用默认参数安装),默认使用的共享文件存储是 NFS ,以 Pod 方式运行在 Kubernetes 中,但这种方式也有一些无法 ...
- 立方骑士(lgP7354)
来水篇题解((( 图炸了,去洛谷博客看吧. 注:在本篇题解中, \(K\) 表示国王, \(N\) 表示骑士,不同颜色的 \(X\) 表示该位置国王可以达到,且被与之相同颜色的骑士封锁.方法不唯一,图 ...
- Java文件与IO流
首先我们要清楚什么是流,正如其名,很形象,流就是像水一样的东西,具有方向性,在java中 ,流大概就是类 接下来,我们要对输入输出流有一个基本认识,什么是输入输出流呢? 输入输出明显需要一个参照,而这 ...