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

运行结果



线性变换###

线性变换的公式为:

\[O(r,c)=a*I(r,c)+b,0\leq r<R\; 0\leq c<W
\]

图像的线性变换无疑就是利用矩阵的乘法就行线性变换,比如一个矩阵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中的最小灰度级记为\(O_{min}\),最大灰度级记为\(O_{max}\),假如输出的图像P的灰度级范围为[\(P_{min},P_{max}\)],则O 与 P的关系为:

\[O(r,c)=\cfrac{P_{max}-P_{min}}{O_{max}-O_{min}}(O(r,c)-O_{min})+P_{min}
\]

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

\[a=\cfrac{P_{max}-P_{min}}{O_{max}-O_{min}} , b=P_{min}-\cfrac{P_{max}-P_{min}}{O_{max}-O_{min}} *O_{min}
\]

下面我们使用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)^\gamma\),0\(\leq r<H,0\leq\)c<W.

当\(\gamma\)等于1时图像不发生变换,而当\(\gamma\)大于0且小于1时就可以增强图像的对比度,相反的当\(\gamma\)大于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()

运行结果:

OpenCV图像增强(python)的更多相关文章

  1. (原)windows8.1上使用opencv for python

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6204100.html 参考网址: http://www.docs.opencv.org/master/ ...

  2. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  3. Ubuntu16.04安装opencv for python/c++

    Ubuntu16.04安装opencv for python/c++ 网上关于opencv的安装已经有了不少资料,但是没有一篇资料能让我一次性安装成功,因此花费了大量时间去解决各种意外,希望这篇能给一 ...

  4. [PyImageSearch] Ubuntu16.04 使用OpenCV和python识别信用卡 OCR

    在今天的博文中,我将演示如何使用模板匹配作为OCR的一种形式来帮助我们创建一个自动识别信用卡并从图像中提取相关信用卡数位的解决方案. 今天的博文分为三部分. 在第一部分中,我们将讨论OCR-A字体,这 ...

  5. 深度学习 + OpenCV,Python实现实时视频目标检测

    使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能. 在本文中我们将学习如何扩展原有的目标检测项 ...

  6. day1 Opencv安装 python 2.7 (32位)

    [参考安装步骤] http://opencv-python-tutroals.readthedocs.io/en/latest/index.html http://blog.csdn.net/huru ...

  7. OpenCV for Python 学习笔记 一

    本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http:/ ...

  8. CentOS7配置opencv for python && eclipse c/c++[更新]

    更改前的安装过程有些问题,主要是ffmpeg-devel的安装部分,这里重新说一下 两种安装方法: 第一种,直接: # yum install numpy opencv* 这种方法安装了之后,能够在p ...

  9. OpenCV的Python接口

    Python教程系列:http://blog.csdn.net/sunny2038/article/details/9057415 与C++的不同之处:http://developer.51cto.c ...

  10. OpenCv的python环境搭建

    1.python的安装参看 http://www.cnblogs.com/samo/p/6734403.html 2.OpenCv安装.opencv2.4.10可以支持vc10/vc11/vc12,o ...

随机推荐

  1. 关于jQuery中toggle参数callback函数提前执行问题

    通过 jQuery,您可以使用 toggle() 方法来切换 hide() 和 show() 方法. 显示被隐藏的元素,并隐藏已显示的元素: $(selector).toggle(speed,call ...

  2. 树莓派搭建钓鱼wifi热点

    我们连接的公共wifi其实是非常不安全的网络,骇客可以利用wifi路由设备进行中间人攻击,劫持DNS伪造钓鱼网站.接下来我会做个简单的实验,伪造中国电信的路由ChinaNet并发射出热点wifi等待别 ...

  3. [LC] 102. Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  4. OpenAL介绍

    OpenAL(Open Audio Library)是自由软件界的跨平台音效API,由Loki Software,使用在Windows.Linux 系统上,用在音效缓冲和收听中编码. OpenAL设计 ...

  5. Django连接SQL Server,安装相关扩展包及相关配置

    1.python下载 https://www.python.org/downloads/windows/ 2.根据当前windows和python的版本,下载pymssql相应的exe安装文件. ht ...

  6. django框架基础-ORM进阶-长期维护

    ###############    ORM进阶---contenttype    ################ 设计思路: """ 路飞有两种课,专题课和学位课, ...

  7. HDU-6672-Seq

    题目传送门 ps:一般这种给一个数列求第n项,n还特别大的.要么矩阵快速幂,要么转化递推式.不过这题数据也特别多有100000组,所以就算矩阵快速幂可能也要超时,而且我还没推出来.转化递推式需要比较强 ...

  8. MAYA卸载/完美解决安装失败/如何彻底卸载清除干净MAYA各种残留注册表和文件的方法

    在卸载MAYA重装MAYA时发现安装失败,提示是已安装或安装失败.这是因为上一次卸载后没有清理干净,系统会误认为已经安装过了.有的同学是新装的系统也会出现安装失败的情况,这是因为C++ 或者.NET的 ...

  9. iOS应用程序开发——解决iOS7之前版本与之后版本下app启动图片跳动问题

    之前开发的app都是针对iOS6(兼容iOS5),所以在开发之初也出现了启动图片向下跳动的现象,通过网上的解决方法,代码中做了处理(“-20”): _imageView.frame = CGRectM ...

  10. 【网上转载搜罗】本博客花里胡哨(划掉)效果js代码

    <canvas class="fireworks" style="position:fixed;left:0;top:0;z-index:99999999;poin ...