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中的Numeric包和Numarray包使用教程
Apr 13 Python
Python中条件判断语句的简单使用方法
Aug 21 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
解决pytorch报错:AssertionError: Invalid device id的问题
Jan 10 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
Feb 12 Python
python xlsxwriter模块的使用
Dec 24 Python
Python 正则模块详情
Nov 02 Python
Python 图片添加美颜效果
Apr 28 Python
python pygame 开发五子棋双人对弈
May 02 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
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
详解Python命令行解析工具Argparse
2016/04/20 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
django中forms组件的使用与注意
2019/07/08 Python
python实现大文件分割与合并
2019/07/22 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
活动志愿者自荐信
2014/01/27 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
小学安全教育材料
2014/02/17 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书