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 mysqldb连接数据库
Mar 16 Python
浅析python 中__name__ = '__main__' 的作用
Jul 05 Python
python实现Decorator模式实例代码
Feb 09 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
Pytorch Tensor的索引与切片例子
Aug 18 Python
python 多线程共享全局变量的优劣
Sep 24 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
windows+vscode安装paddleOCR运行环境的步骤
Nov 11 Python
python爬虫selenium模块详解
Mar 30 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
php 购物车的例子
2009/05/04 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
js的写法基础分析
2011/01/17 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
微信小程序框架的页面布局代码
2019/08/17 Javascript
React组件设计模式之组合组件应用实例分析
2020/04/29 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
python实现的简单猜数字游戏
2015/04/04 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
Django框架models使用group by详解
2020/03/11 Python
Django通过json格式收集主机信息
2020/05/29 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
Python turtle库的画笔控制说明
2020/06/28 Python
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
高中生学期学习自我评价
2014/02/24 职场文书
实习推荐信
2014/05/10 职场文书
乒乓球比赛通知
2015/04/27 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
图文详解matlab原始处理图像几何变换
2021/07/09 Python
Python序列化模块JSON与Pickle
2022/06/05 Python