Python 图像对比度增强的几种方法(小结)


Posted in Python onSeptember 25, 2019

图像处理工具——灰度直方图

灰度直方图时图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。
例子:矩阵

Python 图像对比度增强的几种方法(小结)

图片来自网络,侵删!

Python 图像对比度增强的几种方法(小结)

上面图片的灰度直方图

Python 图像对比度增强的几种方法(小结)

python实现

#!usr/bin/env python
#-*- coding:utf-8 _*-
"""
@author:Sui yue
@describe: 灰度直方图,描述每个灰度级在图像矩阵中的像素个数或者占有率
@time: 2019/09/15
"""

import sys
import cv2
import numpy as np
import matplotlib.pyplot as plt

#对于8位图,图像的灰度级范围式0~255之间的整数,通过定义函数来计算直方图
def calcGrayHist(image):
 #灰度图像矩阵的高、宽
 rows, cols = image.shape
 #存储灰度直方图
 grayHist=np.zeros([256],np.uint64)
 for r in range(rows):
  for c in range(cols):
   grayHist[image[r][c]] +=1
 return grayHist
#主函数
if __name__=="__main__":
 #第一个参数式图片地址,你只需放上你的图片就可
 image = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE)
 cv2.imshow("image", image)
 print("Usge:python histogram.py imageFile")
 #计算灰度直方图
 grayHist=calcGrayHist(image)
 #画出灰度直方图
 x_range=range(256)
 plt.plot(x_range,grayHist,'r',linewidth=2,c='black')
 #设置坐标轴的范围
 y_maxValue=np.max(grayHist)
 plt.axis([0,255,0,y_maxValue])
 plt.ylabel('gray level')
 plt.ylabel("number or pixels")
 # 显示灰度直方图
 plt.show()
 cv2.waitKeyEx(0)

结果

Python 图像对比度增强的几种方法(小结)

线性变换

假设输入图像为I,宽W、高为H,输出图像为O,图像的线性变换可以利用以下公式:

Python 图像对比度增强的几种方法(小结)

a的改变影响图像的对比度,b的改变影响图像的亮度

线性变换python实现

#!usr/bin/env python3
#-*- coding:utf-8 -*-
#--------------------------
"""
@author:Sui yue
@describe: 对比增强,线性变换
@time: 2019/09/15 14:21:44
"""
import sys
import numpy as np
import cv2
import matplotlib.pyplot as plt
#主函数

def calcGrayHist(image):
 #灰度图像矩阵的高、宽
 rows, cols = image.shape
 #存储灰度直方图
 grayHist=np.zeros([256],np.uint64)
 for r in range(rows):
  for c in range(cols):
   grayHist[image[r][c]] +=1
   # 显示灰度直方图
 # 画出灰度直方图
 x_range = range(256)
 plt.plot(x_range, grayHist, 'r', linewidth=2, c='black')
 # 设置坐标轴的范围
 y_maxValue = np.max(grayHist)
 plt.axis([0, 255, 0, y_maxValue])
 plt.ylabel('gray level')
 plt.ylabel("number or pixels")
 # 显示灰度直方图
 plt.show()

if __name__=="__main__":
 # 读图像
 I = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE)
 #线性变换
 a=3
 O=float(a)*I
 #进行数据截断,大于255 的值要截断为255
 O[0>255]=255
 #数据类型转换
 O=np.round(O)
 #uint8类型
 O=O.astype(np.uint8)
 #显示原图和线性变换后的效果
 cv2.imshow("I",I)
 cv2.imshow("O",O)
 calcGrayHist(I)
 calcGrayHist(O)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

线性变换结果

Python 图像对比度增强的几种方法(小结)

灰度直方图

Python 图像对比度增强的几种方法(小结)

直方图正规化

假设输入图像为I,宽W、高为HIr,c)I(r,c)I(r,c)代表I的第r行第c列的灰度值,将I中出现的最小灰度级记为IminI_{min}Imin​,最大灰度级记为ImaxI_{max}Imax​,Ir,c[Imin,Imax]I(r,c)\in [I_{min},I_{max}]I(r,c)∈[Imin​,Imax​],为使输出图像O的灰度级范围为 [Omin,Omax][O_{min},O_{max}][Omin​,Omax​],Ir,c)I(r,c)I(r,c)和Or,c)O(r,c)O(r,c)做以下映射关系:

Python 图像对比度增强的几种方法(小结)

其中0r<H,0c<W\quad0\le r \lt H,0\le c \lt W0≤r<H,0≤c<W,O(r,c)O(r,c)O(r,c)代表O的第r行和第c列的灰度值。这个过程就是常称的直方图正规化。因为0I(r,c)IminImaxImin10 \le\frac{I(r,c)-I_{min}}{I_{max}-I_{min}} \le 10≤Imax​−Imin​I(r,c)−Imin​​≤1,所以O(r,c)[Omin,Omax]O(r,c) \in [O_{min},O_{max}]O(r,c)∈[Omin​,Omax​],一般令Omin=0O_{min}=0Omin​=0,Omax=255O_{max}=255Omax​=255。显然,直方图正规化使一种自动选取a和b的值的线性变换方法,其中

Python 图像对比度增强的几种方法(小结)

直方图正规化python实现

#!usr/bin/env python3
#-*- coding:utf-8 -*-
#--------------------------
"""
@author:Sui yue
@describe: 直方图正规化
@time: 2019/09/18 21:17:22
"""

import cv2
import numpy as np
import matplotlib.pyplot as plt
import sys

def calcGrayHist(image):
 #灰度图像矩阵的高、宽
 rows, cols = image.shape
 #存储灰度直方图
 grayHist=np.zeros([256],np.uint64)
 for r in range(rows):
  for c in range(cols):
   grayHist[image[r][c]] +=1
   # 显示灰度直方图
 # 画出灰度直方图
 x_range = range(256)
 plt.plot(x_range, grayHist, 'r', linewidth=2, c='black')
 # 设置坐标轴的范围
 y_maxValue = np.max(grayHist)
 plt.axis([0, 255, 0, y_maxValue])
 plt.ylabel('gray level')
 plt.ylabel("number or pixels")
 # 显示灰度直方图
 plt.show()
#主函数
if __name__ == '__main__':
 #读入图像
 I = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE)
 #求I的最大值,最小值
 Imax=np.max(I)
 Imin=np.min(I)
 #要输出的最小灰度级和最大灰度级
 Omax,Omin=255,0
 #计算a和b的值 ,测试出*4 能看到人脸
 a=float(Omax-Omin)/(Imax-Imin)
 b=Omin-a*Imin
 #矩阵的线性变换
 O=a*I+b
 #数据类型转换
 O=O.astype(np.uint8)
 #显示原图和直方图正规化的效果
 cv2.imshow("I",I)
 cv2.imshow("O",O)
 calcGrayHist(O)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

直方图正规化结果

Python 图像对比度增强的几种方法(小结)

Python 图像对比度增强的几种方法(小结)

伽马变换

假设输入图像为I,宽W、高为H,首先将其灰度值归一化到[0,1][0,1][0,1]范围,对于8位图来说,除以255即可。I(r,c)I(r,c)I(r,c)代表归一化后的第r行第c列的灰度值,为使输出图像O ,伽马变换就是令O(r,c)=I(r,c)γ,0r<H,0c<WO(r,c)=I(r,c)^\gamma,\quad0\le r \lt H,0\le c \lt WO(r,c)=I(r,c)γ,0≤r<H,0≤c<W,如下图所示:

Python 图像对比度增强的几种方法(小结)

γ=1\gamma=1γ=1时,图像不变。如果图像整体或者感兴趣区域较暗,则令0γ<10\le \gamma \lt 10≤γ<1可以增加图像对比度;相反图像整体或者感兴趣区域较亮,则令γ>1\gamma \gt 1γ>1可以降低图像对比度。

伽马变换python实现

#!usr/bin/env python3
#-*- coding:utf-8 -*-
#--------------------------
"""
@author:Sui yue
@describe: 对比增强 伽马变换
@time: 2019/09/18 22:22:51
"""
import cv2
import numpy as np
import sys
#主函数
if __name__ == '__main__':
  I = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE)
  #图像归一化
  fI=I/255.0
  #伽马变换
  gamma=0.3
  O=np.power(fI,gamma)
  #显示原图和伽马变换
  cv2.imshow("I",I)
  cv2.imshow("O",O)
  cv2.waitKey()
  cv2.destroyAllWindows()

伽马变换结果

Python 图像对比度增强的几种方法(小结)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用xlrd模块操作Excel数据导入的方法
May 26 Python
Python标准模块--ContextManager上下文管理器的具体用法
Nov 27 Python
Python实现通过解析域名获取ip地址的方法分析
May 17 Python
将Python字符串生成PDF的实例代码详解
May 17 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
python新手学习可变和不可变对象
Jun 11 Python
python能开发游戏吗
Jun 11 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
关于python中remove的一些坑小结
Jan 04 Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 #Python
python super的使用方法及实例详解
Sep 25 #Python
Pycharm+Python+PyQt5使用详解
Sep 25 #Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 #Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 #Python
Python实现串口通信(pyserial)过程解析
Sep 25 #Python
Python根据服务获取端口号的方法
Sep 25 #Python
You might like
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
jQuery代码优化 选择符篇
2011/11/01 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
Python中函数的返回值示例浅析
2019/08/28 Python
Python的Lambda函数用法详解
2019/09/03 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
Django admin组件的使用
2020/10/24 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
祖国在我心中演讲稿500字
2014/05/04 职场文书
李培根演讲稿
2014/05/22 职场文书
门店业绩提升方案
2014/06/08 职场文书
创先争优活动心得体会
2014/09/04 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
信息技术研修心得体会
2016/01/08 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python