python 基于opencv实现图像增强


Posted in Python onDecember 23, 2020

为了得到更加清晰的图像我们需要通过技术对图像进行处理,比如使用对比度增强的方法来处理图像,对比度增强就是对图像输出的灰度级放大到指定的程度,获得图像质量的提升。本文主要通过代码的方式,通过OpenCV的内置函数将图像处理到我们理想的结果。

灰度直方图

灰度直方图通过描述灰度级在图像矩阵中的像素个数来展示图像灰度级的信息,通过灰度直方图的统计我们可以看到每个灰度值的占有率。下面是一个灰度直方图的实现:

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

#计算灰度直方图
def calcGrayHist(image):
  rows,clos = image.shape
  #创建一个矩阵用于存储灰度值
  grahHist = np.zeros([256],np.uint64)
  print('这是初始化矩阵')
  print(grahHist )
  for r in range(rows):
    for c in range(clos):
      #通过图像矩阵的遍历来将灰度值信息放入我们定义的矩阵中
      grahHist[image[r][c]] +=1
  print('这是赋值后的矩阵')
  print(grahHist)
  return grahHist
if __name__=="__main__":
  image = cv2.imread("../img/aa.jpg",cv2.IMREAD_GRAYSCALE)
  grahHist = calcGrayHist(image)
  x_range = range(256)
  plt.plot(x_range,grahHist,'-',linewidth= 3,c='k')
  #设置坐标轴的范围
  y_maxValue = np.max(grahHist)
  plt.axis([0,255,0,y_maxValue])
  #设置标签
  plt.xlabel('gray Level')
  plt.ylabel("number of pixels")
  #显示灰度直方图
  plt.show()

运行结果

python 基于opencv实现图像增强

python 基于opencv实现图像增强

线性变换

线性变换的公式为:

python 基于opencv实现图像增强

图像的线性变换无疑就是利用矩阵的乘法就行线性变换,比如一个矩阵I ,2I,3I (np.unt8 ndarry类型就是unt8类型)就是一个矩阵的变换.

import cv2
import numpy as np
import sys

if __name__=="__main__":
  img = cv2.imread("../img/ae.jpg",cv2.IMREAD_GRAYSCALE)
  a=2
  #线性变换 定义float类型
  O = float(a)*img
  #数据截取 如果大于255 取 255
  O[0>255] = 255
  #数据类型的转换
  O = np.round(O)
  O = O.astype(np.uint8)
  cv2.imshow("img",img)
  cv2.imshow('enhance',O)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

运行结果:

python 基于opencv实现图像增强

灰度级范围越大就代表对比度越高,反之对比度越低视觉上清晰度就越低。我们通过a=2的线性对比度拉伸将灰度级范围扩大到[0,255]之间,如上图我们改变灰度级的范围后图像变的清晰。

直方图正规化

将图像O中的最小灰度级记为OminOmin,最大灰度级记为OmaxOmax,假如输出的图像P的灰度级范围为[Pmin,PmaxPmin,Pmax],则O 与 P的关系为:

python 基于opencv实现图像增强

其中P(r,c)就代表P的第r行第c列的灰度值。这个过程就是直方图的正规化。我们一般令P的范围是[0,255],所以直方图的正规化是在求a,b变换的值的方法,我们可以得到:

python 基于opencv实现图像增强

下面我们使用OpenCV来实现上面的理论:

import cv2
import numpy as np
import sys
from enhance.GrayHist import mget
if __name__=="__main__":
  img = cv2.imread("../img/o3.jpg",cv2.IMREAD_GRAYSCALE)
  #求出img 的最大最小值
  Maximg = np.max(img)
  Minimg = np.min(img)
  print(Maximg, Minimg, '-----------')
  #输出最小灰度级和最大灰度级
  Omin,Omax = 0,255
  #求 a, b
  a = float(Omax - Omin)/(Maximg - Minimg)
  b = Omin - a*Minimg
  print(a,b,'-----------')
  #线性变换
  O = a*img + b
  O = O.astype(np.uint8)
  #利用灰度直方图进行比较 mget为GrayHist中的写方法
  mget(img)
  mget(O)


  cv2.imshow('img',img)
  cv2.imshow('enhance',O)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

python 基于opencv实现图像增强

python 基于opencv实现图像增强

伽玛变换

将一张图的灰度值归至[0,1]后,对于8位图来说,除以255即可。伽玛变换就是令O(r,c)=I(r,c)γI(r,c)γ,0≤r<H,0≤≤r<H,0≤c<W.
当γγ等于1时图像不发生变换,而当γγ大于0且小于1时就可以增强图像的对比度,相反的当γγ大于1时就可以使图像对比度降低。 以下是伽玛变换在OpenCV中的实现:

import cv2
import numpy as np
import sys

# 伽玛变换 power函数实现幂函数

if __name__ == "__main__":
  img = cv2.imread("../img/ae.jpg", cv2.IMREAD_GRAYSCALE)
  # 归1
  Cimg = img / 255
  # 伽玛变换
  gamma = 0.5
  O = np.power(Cimg,gamma)
  #效果
  cv2.imshow('img',img)
  cv2.imshow('O',O)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

运行结果:

python 基于opencv实现图像增强

直方图的均衡化

  • 计算图像的灰度直方图
  • 计算灰度直方图的累加直方图
  • 根据累加的直方图和直方图均衡化的原理得到输入灰度级与输出灰度级之间的映射关系
  • 使用循环的方式得到输出图像的每一个像素的灰度级
import cv2
import numpy as np
from enhance.GrayHist import calcGrayHist

#直方图的均衡化
if __name__ == "__main__":
  image = cv2.imread("../img/ae.jpg", cv2.IMREAD_GRAYSCALE)
  rows,cols = image.shape
  #计算灰度直方图
  grayHist = calcGrayHist(image)
  #计算累加灰度直方图
  zeroCumuMoment = np.zeros([256], np.uint32)
  for p in range(256):
    if p == 0:
      zeroCumuMoment[p] = grayHist[0]
    else:
      zeroCumuMoment[p] = zeroCumuMoment[p-1] + grayHist[p]
  #根据累加的灰度直方图得到输入与输出灰度级之间的映射关系
  output = np.zeros([256],np.uint8)
  cofficient = 256.0/(rows*cols)
  for p in range(256):
    q = cofficient * float(zeroCumuMoment[p])-1
    if q >=0:
      output[p] = np.math.floor(q)
    else:
      output[p] = 0
  #得出均衡化图像
  equalHistimg = np.zeros(image.shape,np.uint8)
  for r in range(rows):
    for c in range(cols):
      equalHistimg[r][c] = output[image[r][c]]
  cv2.imshow('image',image)
  cv2.imshow('histimage',equalHistimg)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

运行结果:

python 基于opencv实现图像增强

以上就是python 基于opencv实现图像增强的详细内容,更多关于python opencv的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
分享15个最受欢迎的Python开源框架
Jul 13 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
Jul 03 Python
python禁用键鼠与提权代码实例
Aug 16 Python
Python银行系统实战源码
Oct 25 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
python数据预处理 :数据抽样解析
Feb 24 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
python turtle绘制多边形和跳跃和改变速度特效
Mar 16 Python
pd.DataFrame中的几种索引变换的实现
Jun 16 Python
python接口自动化框架实战
Dec 23 #Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 #Python
python实现发送QQ邮件(可加附件)
Dec 23 #Python
如何通过安装HomeBrew来安装Python3
Dec 23 #Python
python实现定时发送邮件到指定邮箱
Dec 23 #Python
python实现定时发送邮件
Dec 23 #Python
python脚本定时发送邮件
Dec 22 #Python
You might like
默默简单的写了一个模板引擎
2007/01/02 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
寻找网站后台地址的python脚本
2014/09/01 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
python制作mysql数据迁移脚本
2019/01/01 Python
Python 使用type来定义类的实现
2019/11/19 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
Python reques接口测试框架实现代码
2020/07/28 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
英语自我评价范文
2014/01/24 职场文书
小学教师师德感言
2014/02/10 职场文书
2014年妇女工作总结
2014/12/06 职场文书
户外拓展训练感想
2015/08/07 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL