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之hello world
May 21 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
python调用OpenCV实现人脸识别功能
May 25 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
python实现简单加密解密机制
Mar 19 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
基于python实现学生信息管理系统
Nov 22 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
python怎么提高计算速度
Jun 11 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 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
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
php遍历目录viewDir函数
2009/12/15 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
js封装的textarea操作方法集合(兼容很好)
2010/11/16 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
python3获取当前目录的实现方法
2019/07/29 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
HTML5制作表格样式
2016/11/15 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
2014年乡镇人大工作总结
2014/11/25 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL