【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所示 ...
随机推荐
- minio 支持object搜索方案
minio支持上传时对object打标签,查询时可以根据标签做筛选.但是有ftp上传文件的需求,导致无法给object打标签.并且也不清楚minio对于根据标签的筛选性能如何,因此我们打算将objec ...
- Salesforce LWC学习(四十五) lwc支持Console App控制Tab了
本篇参考:https://help.salesforce.com/s/articleView?id=release-notes.rn_lwc_workspaceAPI.htm&release= ...
- 从零开始:Spring Security Oauth2 讲解及实战
OAuth2.0的四种授权模式: https://blog.csdn.net/weixin_30849403/article/details/101958273 1.授权服务配置: 配置一个授权服务, ...
- 如何随心所欲调试HotSpot VM源代码?(改造为CMakeLists项目)
常有小伙伴问我是怎么调试HotSpot VM源代码的,我之前通过视频和文章介绍过一种大家都用的调试方法,如下: 文章地址:第1.2篇-调试HotSpot VM源代码(配视频) 视频地址:https:/ ...
- Building-Mobile-Apps-with-Ionic-2中文翻译工作
最近没啥工作量, 然后学完了这本书, 接着又茫然找不到该干啥, 所以想着何不翻译这个书呢. 这本书首先给我们普及了Ionic 2的基础知识, Ionic 2和Ionic 1有本质上的区别, Ionic ...
- P6066 [USACO05JAN] Watchcow S
prologue 这个题这么水的一个板子题. analysis 这个题目我们正反建两条边,在跑欧拉回路的时候,看这个边是不是被走过,走过就不走,跳过这个边.如果没走,就走这条边并且标记这个边走过了. ...
- 再学Blazor——概述
简介 Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性. 使用 C# 语言创建丰富的交互式 UI 共享前后端应用逻辑 可以生成混合桌面和移动应用 受益于 .NET ...
- shell脚本之语句(条件、循环)
条件语句 1.测试 使用[]时要使用空格,注意格式 格式1:test 条件表达式 格式2:[ 条件表达式 ]#注意空格 注意[]空格,否则会失败 测试 是否成功使用 $?返回值来判断 [ 操 ...
- 用结构化思维解一切BUG(2):实践原则
背景 本文是系列文章<用结构化思维解一切BUG>的第二篇.本系列文章主要介绍一种「无需掌握技术细节,只需结构化思维和常识即可解一切BUG的方法」. 在前序文章<用结构化思维解一切BU ...
- 自然语言处理历史史诗:NLP的范式演变与Python全实现
本文全面回顾了自然语言处理(NLP)从20世纪50年代至今的历史发展.从初创期的符号学派和随机学派,到理性主义时代的逻辑和规则范式,再到经验主义和深度学习时代的数据驱动方法,以及最近的大模型时代,NL ...