首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

图像处理之调整亮度与对比度

  • 23-09-22 19:42
  • 4712
  • 10702
blog.csdn.net

图像处理之调整亮度与对比度

 

很多时候,一张图像被过度曝光显得很白,或者光线不足显得很暗,有时候背景跟图像人物

也观察不清楚,这个时候可以通过调节图像的两个基本属性-亮度与对比度来获得整体效果

的提升,从而得到质量更高的图片。

 

基本原理:

图像亮度本质上图像中每个像素的亮度,每个像素的亮度本质上RGB值的大小,RGB值为0

是像素点为黑色,RGB都为255时像素点最亮,为白色。对比度则是不同像素点之间的差值,

差值越大,对比度越明显。从直方图分析的观点来看,对比度越好的图片,直方图曲线会越

明显,分布也越显得均匀。

 

算法流程:

调整图像亮度与对比度算法主要由以下几个步骤组成:

1.      计算图像的RGB像素均值– M

2.      对图像的每个像素点Remove平均值-M

3.      对去掉平均值以后的像素点 P乘以对比度系数

4.      对步骤上处理以后的像素P加上 M乘以亮度系统

5.      对像素点RGB值完成重新赋值

 

算法系数

对比度 contrast的最佳取值范围在[0 ~ 4],

亮度 brightness的最佳取值范围在[0~ 2]之间

算法的源程序代码见最后源代码部分

 

程序效果:

调整亮度与对比度的滤镜源代码如下:

  1. package com.process.blur.study;
  2. import java.awt.image.BufferedImage;
  3. /**
  4. * this filter illustrate the brightness and contrast of the image
  5. * and demo how to change the both attribute of the image.
  6. *
  7. * @author gloomy fish
  8. *
  9. */
  10. public class ConBriFilter extends AbstractBufferedImageOp {
  11. private float contrast = 1.5f; // default value;
  12. private float brightness = 1.0f; // default value;
  13. public ConBriFilter() {
  14. // do stuff here if you need......
  15. }
  16. @Override
  17. public BufferedImage filter(BufferedImage src, BufferedImage dest) {
  18. int width = src.getWidth();
  19. int height = src.getHeight();
  20. if ( dest == null )
  21. dest = createCompatibleDestImage( src, null );
  22. int[] inPixels = new int[width*height];
  23. int[] outPixels = new int[width*height];
  24. src.getRGB( 0, 0, width, height, inPixels, 0, width );
  25. // calculate RED, GREEN, BLUE means of pixel
  26. int index = 0;
  27. int[] rgbmeans = new int[3];
  28. double redSum = 0, greenSum = 0, blueSum = 0;
  29. double total = height * width;
  30. for(int row=0; row
  31. int ta = 0, tr = 0, tg = 0, tb = 0;
  32. for(int col=0; col
  33. index = row * width + col;
  34. ta = (inPixels[index] >> 24) & 0xff;
  35. tr = (inPixels[index] >> 16) & 0xff;
  36. tg = (inPixels[index] >> 8) & 0xff;
  37. tb = inPixels[index] & 0xff;
  38. redSum += tr;
  39. greenSum += tg;
  40. blueSum +=tb;
  41. }
  42. }
  43. rgbmeans[0] = (int)(redSum / total);
  44. rgbmeans[1] = (int)(greenSum / total);
  45. rgbmeans[2] = (int)(blueSum / total);
  46. // adjust contrast and brightness algorithm, here
  47. for(int row=0; row
  48. int ta = 0, tr = 0, tg = 0, tb = 0;
  49. for(int col=0; col
  50. index = row * width + col;
  51. ta = (inPixels[index] >> 24) & 0xff;
  52. tr = (inPixels[index] >> 16) & 0xff;
  53. tg = (inPixels[index] >> 8) & 0xff;
  54. tb = inPixels[index] & 0xff;
  55. // remove means
  56. tr -=rgbmeans[0];
  57. tg -=rgbmeans[1];
  58. tb -=rgbmeans[2];
  59. // adjust contrast now !!!
  60. tr = (int)(tr * getContrast());
  61. tg = (int)(tg * getContrast());
  62. tb = (int)(tb * getContrast());
  63. // adjust brightness
  64. tr += (int)(rgbmeans[0] * getBrightness());
  65. tg += (int)(rgbmeans[1] * getBrightness());
  66. tb += (int)(rgbmeans[2] * getBrightness());
  67. outPixels[index] = (ta << 24) | (clamp(tr) << 16) | (clamp(tg) << 8) | clamp(tb);
  68. }
  69. }
  70. setRGB( dest, 0, 0, width, height, outPixels );
  71. return dest;
  72. }
  73. public int clamp(int value) {
  74. return value > 255 ? 255 :(value < 0 ? 0 : value);
  75. }
  76. public float getContrast() {
  77. return contrast;
  78. }
  79. public void setContrast(float contrast) {
  80. this.contrast = contrast;
  81. }
  82. public float getBrightness() {
  83. return brightness;
  84. }
  85. public void setBrightness(float brightness) {
  86. this.brightness = brightness;
  87. }
  88. }


文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览51048 人正在系统学习中
注:本文转载自blog.csdn.net的gloomyfish的文章"https://blog.csdn.net/jia20003/article/details/7385160"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top