【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。
至此,灰度直方图的算法理解完毕。
总结:灰度直方图核心点即,获取图像每个灰度级存在的个数