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 相关文章推荐
python比较两个列表大小的方法
Jul 11 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 Python
python分布式环境下的限流器的示例
Oct 26 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Python读取YUV文件,并显示的方法
Dec 04 Python
详解python实现数据归一化处理的方式:(0,1)标准化
Jul 17 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
python基于property()函数定义属性
Jan 22 Python
Python中remove漏删和索引越界问题的解决
Mar 18 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 Python
python绘制云雨图raincloud plot
Aug 05 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
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
js+html制作简单验证码
2017/02/16 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
python 中if else 语句的作用及示例代码
2018/03/05 Python
python 多个参数不为空校验方法
2019/02/14 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
外企测试工程师面试题
2015/02/01 面试题
基于Python 函数和方法的区别说明
2021/03/24 Python
家居设计专业个人自荐信范文
2013/11/26 职场文书
房地产开发计划书
2014/01/10 职场文书
《匆匆》教学反思
2014/02/22 职场文书
环境保护建议书
2014/08/26 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
融资合作协议书范本
2014/10/17 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
商业计划书范文
2019/04/24 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python