python 基于opencv实现图像增强

 更新时间:2020年12月23日 11:14:37   作者:Superme  
这篇文章主要介绍了python 基于opencv实现图像增强的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下

为了得到更加清晰的图像我们需要通过技术对图像进行处理,比如使用对比度增强的方法来处理图像,对比度增强就是对图像输出的灰度级放大到指定的程度,获得图像质量的提升。本文主要通过代码的方式,通过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()

运行结果

线性变换

线性变换的公式为:

图像的线性变换无疑就是利用矩阵的乘法就行线性变换,比如一个矩阵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()

运行结果:

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

直方图正规化

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

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

下面我们使用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()

伽玛变换

将一张图的灰度值归至[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()

运行结果:

直方图的均衡化

  • 计算图像的灰度直方图
  • 计算灰度直方图的累加直方图
  • 根据累加的直方图和直方图均衡化的原理得到输入灰度级与输出灰度级之间的映射关系
  • 使用循环的方式得到输出图像的每一个像素的灰度级
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 如何设置守护进程

    python 如何设置守护进程

    这篇文章主要介绍了python 如何设置守护进程,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-10-10
  • 谈谈如何手动释放Python的内存

    谈谈如何手动释放Python的内存

    Python不会自动清理这些内存,这篇文章主要介绍了谈谈如何手动释放Python的内存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • python elasticsearch从创建索引到写入数据的全过程

    python elasticsearch从创建索引到写入数据的全过程

    这篇文章主要介绍了python elasticsearch从创建索引到写入数据的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 使用Python批量生成PPT版荣誉证书的示例代码

    使用Python批量生成PPT版荣誉证书的示例代码

    使用Python处理PPT文件通常需要使用第三方库来简化对PPT文件的读取、写入和修改操作,本文将给大家介绍一个小案例,使用Python批量生成PPT版荣誉证书,感兴趣的同学跟着小编一起来看看吧
    2023-08-08
  • 使用 python pyautogui实现鼠标键盘控制功能

    使用 python pyautogui实现鼠标键盘控制功能

    pyautogui是一个可以控制鼠标和键盘的python库,类似的还有pywin32。这篇文章主要介绍了python中的pyautogui实现鼠标键盘控制功能,需要的朋友可以参考下
    2019-08-08
  • http请求 request失败自动重新尝试代码示例

    http请求 request失败自动重新尝试代码示例

    这篇文章主要介绍了http请求 request失败自动重新尝试代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 使用Python通过win32 COM实现Word文档的写入与保存方法

    使用Python通过win32 COM实现Word文档的写入与保存方法

    今天小编就为大家分享一篇使用Python通过win32 COM实现Word文档的写入与保存方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python中的引用和拷贝实例解析

    Python中的引用和拷贝实例解析

    这篇文章主要介绍了python中的引用和拷贝实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • python批处理将图片进行放大实例代码

    python批处理将图片进行放大实例代码

    最近处理一些规格不一的照片,需要修改成指定尺寸便于打印,下面这篇文章主要给大家介绍了关于python批处理将图片进行放大的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • 使用Python在Word中查找并高亮指定文本

    使用Python在Word中查找并高亮指定文本

    当你需要在长文档或报告中快速找到特定的关键词或短语,Word中提供的查找并高亮这一功能可以帮助你迅速定位这些内容,本文将介绍如何使用Python在Word中查找并突出显示指定的文本,需要的朋友可以参考下
    2024-03-03

最新评论