当前位置:   article > 正文

亮度直方图中RGB转亮度的快速算法

亮度直方图中RGB转亮度的快速算法
亮度直方图中RGB转亮度的快速算法
1)首先给出标准的亮度公式:
    Y(亮度)=(0.299*R)+(0.587*G)+(0.114*B)
式中的 R 代表红色分量的值,G 为绿色分量的值,B 为蓝色分量的值。
 
2)为便于计算,快速算法不采用标准公式,而使用以下只取小数点后两个有效位的近似公式:
    Y(亮度)=(0.30*R)+(0.59*G)+(0.11*B)
 
3) 对于 24 位图像而言,由于红,绿,蓝三原色分量的值域为0~255,我们完全可以事先将整个
值域与系数的运算结果保存为三个元素大小为256的数组,并进一步将浮点数更改为两个无符号字符
型的方式表示,如将 0.30 改为 { 0, 30 } 表示,其中前一元素表示值的整数部分,后一元素表示
值的小数部分。则三原色的亮度值数组结果如下:
 
static 
unsigned char  lumRed[256][2]={
 {  0,0 }, {  0,30 }, {  0,60 }, {  0,90 }, {  1,20 }, {  1,50 }, {  1,80 }, {  2,10 }, {  2,40 }, {  2,70 },
 {  3,0 }, {  3,30 }, {  3,60 }, {  3,90 }, {  4,20 }, {  4,50 }, {  4,80 }, {  5,10 }, {  5,40 }, {  5,70 },
 {  6,0 }, {  6,30 }, {  6,60 }, {  6,90 }, {  7,20 }, {  7,50 }, {  7,80 }, {  8,10 }, {  8,40 }, {  8,70 },
 {  9,0 }, {  9,30 }, {  9,60 }, {  9,90 }, { 10,20 }, { 10,50 }, { 10,80 }, { 11,10 }, { 11,40 }, { 11,70 },
 { 12,0 }, { 12,30 }, { 12,60 }, { 12,90 }, { 13,20 }, { 13,50 }, { 13,80 }, { 14,10 }, { 14,40 }, { 14,70 },
 { 15,0 }, { 15,30 }, { 15,60 }, { 15,90 }, { 16,20 }, { 16,50 }, { 16,80 }, { 17,10 }, { 17,40 }, { 17,70 },
 { 18,0 }, { 18,30 }, { 18,60 }, { 18,90 }, { 19,20 }, { 19,50 }, { 19,80 }, { 20,10 }, { 20,40 }, { 20,70 },
 { 21,0 }, { 21,30 }, { 21,60 }, { 21,90 }, { 22,20 }, { 22,50 }, { 22,80 }, { 23,10 }, { 23,40 }, { 23,70 },
 { 24,0 }, { 24,30 }, { 24,60 }, { 24,90 }, { 25,20 }, { 25,50 }, { 25,80 }, { 26,10 }, { 26,40 }, { 26,70 },
 { 27,0 }, { 27,30 }, { 27,60 }, { 27,90 }, { 28,20 }, { 28,50 }, { 28,80 }, { 29,10 }, { 29,40 }, { 29,70 },
 { 30,0 }, { 30,30 }, { 30,60 }, { 30,90 }, { 31,20 }, { 31,50 }, { 31,80 }, { 32,10 }, { 32,40 }, { 32,70 },
 { 33,0 }, { 33,30 }, { 33,60 }, { 33,90 }, { 34,20 }, { 34,50 }, { 34,80 }, { 35,10 }, { 35,40 }, { 35,70 },
 { 36,0 }, { 36,30 }, { 36,60 }, { 36,90 }, { 37,20 }, { 37,50 }, { 37,80 }, { 38,10 }, { 38,40 }, { 38,70 },
 { 39,0 }, { 39,30 }, { 39,60 }, { 39,90 }, { 40,20 }, { 40,50 }, { 40,80 }, { 41,10 }, { 41,40 }, { 41,70 },
 { 42,0 }, { 42,30 }, { 42,60 }, { 42,90 }, { 43,20 }, { 43,50 }, { 43,80 }, { 44,10 }, { 44,40 }, { 44,70 },
 { 45,0 }, { 45,30 }, { 45,60 }, { 45,90 }, { 46,20 }, { 46,50 }, { 46,80 }, { 47,10 }, { 47,40 }, { 47,70 },
 { 48,0 }, { 48,30 }, { 48,60 }, { 48,90 }, { 49,20 }, { 49,50 }, { 49,80 }, { 50,10 }, { 50,40 }, { 50,70 },
 { 51,0 }, { 51,30 }, { 51,60 }, { 51,90 }, { 52,20 }, { 52,50 }, { 52,80 }, { 53,10 }, { 53,40 }, { 53,70 },
 { 54,0 }, { 54,30 }, { 54,60 }, { 54,90 }, { 55,20 }, { 55,50 }, { 55,80 }, { 56,10 }, { 56,40 }, { 56,70 },
 { 57,0 }, { 57,30 }, { 57,60 }, { 57,90 }, { 58,20 }, { 58,50 }, { 58,80 }, { 59,10 }, { 59,40 }, { 59,70 },
 { 60,0 }, { 60,30 }, { 60,60 }, { 60,90 }, { 61,20 }, { 61,50 }, { 61,80 }, { 62,10 }, { 62,40 }, { 62,70 },
 { 63,0 }, { 63,30 }, { 63,60 }, { 63,90 }, { 64,20 }, { 64,50 }, { 64,80 }, { 65,10 }, { 65,40 }, { 65,70 },
 { 66,0 }, { 66,30 }, { 66,60 }, { 66,90 }, { 67,20 }, { 67,50 }, { 67,80 }, { 68,10 }, { 68,40 }, { 68,70 },
 { 69,0 }, { 69,30 }, { 69,60 }, { 69,90 }, { 70,20 }, { 70,50 }, { 70,80 }, { 71,10 }, { 71,40 }, { 71,70 },
 { 72,0 }, { 72,30 }, { 72,60 }, { 72,90 }, { 73,20 }, { 73,50 }, { 73,80 }, { 74,10 }, { 74,40 }, { 74,70 },
 { 75,0 }, { 75,30 }, { 75,60 }, { 75,90 }, { 76,20 }, { 76,50 },
};
 
static
unsigned char  lumGreen[256][2]={
 {  0, 0}, {  0,59}, {  1,18}, {  1,77}, {  2,36}, {  2,95}, {  3,54}, {  4,13}, {  4,72}, {  5,31},
 {  5,90}, {  6,49}, {  7, 8}, {  7,67}, {  8,26}, {  8,85}, {  9,44}, { 10, 3}, { 10,62}, { 11,21},
 { 11,80}, { 12,39}, { 12,98}, { 13,57}, { 14,16}, { 14,75}, { 15,34}, { 15,93}, { 16,52}, { 17,11},
 { 17,70}, { 18,29}, { 18,88}, { 19,47}, { 20, 6}, { 20,65}, { 21,24}, { 21,83}, { 22,42}, { 23, 1},
 { 23,60}, { 24,19}, { 24,78}, { 25,37}, { 25,96}, { 26,55}, { 27,14}, { 27,73}, { 28,32}, { 28,91},
 { 29,50}, { 30, 9}, { 30,68}, { 31,27}, { 31,86}, { 32,45}, { 33, 4}, { 33,63}, { 34,22}, { 34,81},
 { 35,40}, { 35,99}, { 36,58}, { 37,17}, { 37,76}, { 38,35}, { 38,94}, { 39,53}, { 40,12}, { 40,71},
 { 41,30}, { 41,89}, { 42,48}, { 43, 7}, { 43,66}, { 44,25}, { 44,84}, { 45,43}, { 46, 2}, { 46,61},
 { 47,20}, { 47,79}, { 48,38}, { 48,97}, { 49,56}, { 50,15}, { 50,74}, { 51,33}, { 51,92}, { 52,51},
 { 53,10}, { 53,69}, { 54,28}, { 54,87}, { 55,46}, { 56, 5}, { 56,64}, { 57,23}, { 57,82}, { 58,41},
 { 59, 0}, { 59,59}, { 60,18}, { 60,77}, { 61,36}, { 61,95}, { 62,54}, { 63,13}, { 63,72}, { 64,31},
 { 64,90}, { 65,49}, { 66, 8}, { 66,67}, { 67,26}, { 67,85}, { 68,44}, { 69, 3}, { 69,62}, { 70,21},
 { 70,80}, { 71,39}, { 71,98}, { 72,57}, { 73,16}, { 73,75}, { 74,34}, { 74,93}, { 75,52}, { 76,11},
 { 76,70}, { 77,29}, { 77,88}, { 78,47}, { 79, 6}, { 79,65}, { 80,24}, { 80,83}, { 81,42}, { 82, 1},
 { 82,60}, { 83,19}, { 83,78}, { 84,37}, { 84,96}, { 85,55}, { 86,14}, { 86,73}, { 87,32}, { 87,91},
 { 88,50}, { 89, 9}, { 89,68}, { 90,27}, { 90,86}, { 91,45}, { 92, 4}, { 92,63}, { 93,22}, { 93,81},
 { 94,40}, { 94,99}, { 95,58}, { 96,17}, { 96,76}, { 97,35}, { 97,94}, { 98,53}, { 99,12}, { 99,71},
 {100,30}, {100,89}, {101,48}, {102, 7}, {102,66}, {103,25}, {103,84}, {104,43}, {105, 2}, {105,61},
 {106,20}, {106,79}, {107,38}, {107,97}, {108,56}, {109,15}, {109,74}, {110,33}, {110,92}, {111,51},
 {112,10}, {112,69}, {113,28}, {113,87}, {114,46}, {115, 5}, {115,64}, {116,23}, {116,82}, {117,41},
 {118, 0}, {118,59}, {119,18}, {119,77}, {120,36}, {120,95}, {121,54}, {122,13}, {122,72}, {123,31},
 {123,90}, {124,49}, {125, 8}, {125,67}, {126,26}, {126,85}, {127,44}, {128, 3}, {128,62}, {129,21},
 {129,80}, {130,39}, {130,98}, {131,57}, {132,16}, {132,75}, {133,34}, {133,93}, {134,52}, {135,11},
 {135,70}, {136,29}, {136,88}, {137,47}, {138, 6}, {138,65}, {139,24}, {139,83}, {140,42}, {141, 1},
 {141,60}, {142,19}, {142,78}, {143,37}, {143,96}, {144,55}, {145,14}, {145,73}, {146,32}, {146,91},
 {147,50}, {148, 9}, {148,68}, {149,27}, {149,86}, {150,45},
};
 

static
unsigned char lumBlue[256][2]={
 {  0, 0 }, {  0,11 }, {  0,22 }, {  0,33 }, {  0,44 }, {  0,55 }, {  0,66 }, {  0,77 }, {  0,88 }, {  0,99 },
 {  1,10 }, {  1,21 }, {  1,32 }, {  1,43 }, {  1,54 }, {  1,65 }, {  1,76 }, {  1,87 }, {  1,98 }, {  2, 9 },
 {  2,20 }, {  2,31 }, {  2,42 }, {  2,53 }, {  2,64 }, {  2,75 }, {  2,86 }, {  2,97 }, {  3, 8 }, {  3,19 },
 {  3,30 }, {  3,41 }, {  3,52 }, {  3,63 }, {  3,74 }, {  3,85 }, {  3,96 }, {  4, 7 }, {  4,18 }, {  4,29 },
 {  4,40 }, {  4,51 }, {  4,62 }, {  4,73 }, {  4,84 }, {  4,95 }, {  5, 6 }, {  5,17 }, {  5,28 }, {  5,39 },
 {  5,50 }, {  5,61 }, {  5,72 }, {  5,83 }, {  5,94 }, {  6, 5 }, {  6,16 }, {  6,27 }, {  6,38 }, {  6,49 },
 {  6,60 }, {  6,71 }, {  6,82 }, {  6,93 }, {  7, 4 }, {  7,15 }, {  7,26 }, {  7,37 }, {  7,48 }, {  7,59 },
 {  7,70 }, {  7,81 }, {  7,92 }, {  8, 3 }, {  8,14 }, {  8,25 }, {  8,36 }, {  8,47 }, {  8,58 }, {  8,69 },
 {  8,80 }, {  8,91 }, {  9, 2 }, {  9,13 }, {  9,24 }, {  9,35 }, {  9,46 }, {  9,57 }, {  9,68 }, {  9,79 },
 {  9,90 }, { 10, 1 }, { 10,12 }, { 10,23 }, { 10,34 }, { 10,45 }, { 10,56 }, { 10,67 }, { 10,78 }, { 10,89 },
 { 11, 0 }, { 11,11 }, { 11,22 }, { 11,33 }, { 11,44 }, { 11,55 }, { 11,66 }, { 11,77 }, { 11,88 }, { 11,99 },
 { 12,10 }, { 12,21 }, { 12,32 }, { 12,43 }, { 12,54 }, { 12,65 }, { 12,76 }, { 12,87 }, { 12,98 }, { 13, 9 },
 { 13,20 }, { 13,31 }, { 13,42 }, { 13,53 }, { 13,64 }, { 13,75 }, { 13,86 }, { 13,97 }, { 14, 8 }, { 14,19 },
 { 14,30 }, { 14,41 }, { 14,52 }, { 14,63 }, { 14,74 }, { 14,85 }, { 14,96 }, { 15, 7 }, { 15,18 }, { 15,29 },
 { 15,40 }, { 15,51 }, { 15,62 }, { 15,73 }, { 15,84 }, { 15,95 }, { 16, 6 }, { 16,17 }, { 16,28 }, { 16,39 },
 { 16,50 }, { 16,61 }, { 16,72 }, { 16,83 }, { 16,94 }, { 17, 5 }, { 17,16 }, { 17,27 }, { 17,38 }, { 17,49 },
 { 17,60 }, { 17,71 }, { 17,82 }, { 17,93 }, { 18, 4 }, { 18,15 }, { 18,26 }, { 18,37 }, { 18,48 }, { 18,59 },
 { 18,70 }, { 18,81 }, { 18,92 }, { 19, 3 }, { 19,14 }, { 19,25 }, { 19,36 }, { 19,47 }, { 19,58 }, { 19,69 },
 { 19,80 }, { 19,91 }, { 20, 2 }, { 20,13 }, { 20,24 }, { 20,35 }, { 20,46 }, { 20,57 }, { 20,68 }, { 20,79 },
 { 20,90 }, { 21, 1 }, { 21,12 }, { 21,23 }, { 21,34 }, { 21,45 }, { 21,56 }, { 21,67 }, { 21,78 }, { 21,89 },
 { 22, 0 }, { 22,11 }, { 22,22 }, { 22,33 }, { 22,44 }, { 22,55 }, { 22,66 }, { 22,77 }, { 22,88 }, { 22,99 },
 { 23,10 }, { 23,21 }, { 23,32 }, { 23,43 }, { 23,54 }, { 23,65 }, { 23,76 }, { 23,87 }, { 23,98 }, { 24, 9 },
 { 24,20 }, { 24,31 }, { 24,42 }, { 24,53 }, { 24,64 }, { 24,75 }, { 24,86 }, { 24,97 }, { 25, 8 }, { 25,19 },
 { 25,30 }, { 25,41 }, { 25,52 }, { 25,63 }, { 25,74 }, { 25,85 }, { 25,96 }, { 26, 7 }, { 26,18 }, { 26,29 },
 { 26,40 }, { 26,51 }, { 26,62 }, { 26,73 }, { 26,84 }, { 26,95 }, { 27, 6 }, { 27,17 }, { 27,28 }, { 27,39 },
 { 27,50 }, { 27,61 }, { 27,72 }, { 27,83 }, { 27,94 }, { 28, 5 },
};
 
4) 近似公式变为:
   lumin = lumRed[red][0] + lumGreen[green][0]+ lumBlue[blue][0];
   lumin1 = lumRed[red][1] + lumGreen[green][1]+ lumBlue[blue][1];
   if( lumin1 >= 200 ) lumin += 2;    /* 小数部分产生进位,整数部分加二, 这里不作四舍五入处理 */
   else if( lumin1 >= 100 ) lumin += 1;
 
5) 本算法的关键在于将费时的浮点运算转换为两个整数加法和两个判断处理,在嵌入式系统中对于无浮点协处理器的 MCU/MPU
性能的提高是极为显著的。是典型的以空间换时间的算法。
 
6) 附上利用快速算法的实际效果,以及与 PhotoShop CS2 中的亮度直方图的对比。
histogram
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/126229
推荐阅读
相关标签
  

闽ICP备14008679号