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使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
Python网络编程详解
Oct 31 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
Python使用matplotlib实现基础绘图功能示例
Jul 03 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
python matplotlib包图像配色方案分享
Mar 14 Python
python des,aes,rsa加解密的实现
Jan 16 Python
Django 实现jwt认证的示例
Apr 30 Python
浅谈pytorch中的dropout的概率p
May 27 Python
详解Python flask的前后端交互
Mar 31 Python
python turtle绘图
May 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 基于文件头的文件类型验证类函数
2012/05/01 PHP
PHP类继承 extends使用介绍
2014/01/14 PHP
php学习笔记之面向对象
2014/11/08 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
使用PHP开发留言板功能
2019/11/19 PHP
封装的原生javascript弹出层代码
2010/09/24 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
js实现中文实时时钟
2020/01/15 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
利用Python爬取可用的代理IP
2016/08/18 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
试述DBMS的主要功能
2016/11/13 面试题
介绍一下UNIX启动过程
2013/11/14 面试题
播音主持专业个人自我评价
2014/01/09 职场文书
先进个人事迹材料
2014/01/25 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书