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 fabric使用笔记
May 09 Python
教你用Type Hint提高Python程序开发效率
Aug 08 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
python实现数据写入excel表格
Mar 25 Python
Python Cookie 读取和保存方法
Dec 28 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
Python enumerate内置库用法解析
Feb 24 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
python的setattr函数实例用法
Dec 16 Python
Python可视化学习之matplotlib内置单颜色
Feb 24 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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
php目录遍历函数opendir用法实例
2014/11/20 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
python实现爬虫下载漫画示例
2014/02/16 Python
Python语言的12个基础知识点小结
2014/07/10 Python
Python map和reduce函数用法示例
2015/02/26 Python
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
Python下简易的单例模式详解
2019/04/08 Python
Python实战之制作天气查询软件
2019/05/14 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
使用pytorch实现论文中的unet网络
2020/06/24 Python
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
会议邀请函范文
2014/01/09 职场文书
四个太阳教学反思
2014/02/01 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
出租车拒载检讨书
2015/01/28 职场文书
2015年药店工作总结
2015/04/20 职场文书
原告离婚代理词
2015/05/23 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL