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中的最小灰度级记为\(O_{min}\),最大灰度级记为\(O_{max}\),假如输出的图像P的灰度级范围为[\(P_{min},P_{max}\)],则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)^\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)的更多相关文章
- (原)windows8.1上使用opencv for python
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6204100.html 参考网址: http://www.docs.opencv.org/master/ ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- Ubuntu16.04安装opencv for python/c++
Ubuntu16.04安装opencv for python/c++ 网上关于opencv的安装已经有了不少资料,但是没有一篇资料能让我一次性安装成功,因此花费了大量时间去解决各种意外,希望这篇能给一 ...
- [PyImageSearch] Ubuntu16.04 使用OpenCV和python识别信用卡 OCR
在今天的博文中,我将演示如何使用模板匹配作为OCR的一种形式来帮助我们创建一个自动识别信用卡并从图像中提取相关信用卡数位的解决方案. 今天的博文分为三部分. 在第一部分中,我们将讨论OCR-A字体,这 ...
- 深度学习 + OpenCV,Python实现实时视频目标检测
使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能. 在本文中我们将学习如何扩展原有的目标检测项 ...
- day1 Opencv安装 python 2.7 (32位)
[参考安装步骤] http://opencv-python-tutroals.readthedocs.io/en/latest/index.html http://blog.csdn.net/huru ...
- OpenCV for Python 学习笔记 一
本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http:/ ...
- CentOS7配置opencv for python && eclipse c/c++[更新]
更改前的安装过程有些问题,主要是ffmpeg-devel的安装部分,这里重新说一下 两种安装方法: 第一种,直接: # yum install numpy opencv* 这种方法安装了之后,能够在p ...
- OpenCV的Python接口
Python教程系列:http://blog.csdn.net/sunny2038/article/details/9057415 与C++的不同之处:http://developer.51cto.c ...
- OpenCv的python环境搭建
1.python的安装参看 http://www.cnblogs.com/samo/p/6734403.html 2.OpenCv安装.opencv2.4.10可以支持vc10/vc11/vc12,o ...
随机推荐
- 电脑C盘空间不足
电脑C盘空间不足,又不知道哪些文件可以删,可以下载下面的批处理文件 @echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.t ...
- EXAM-2018-7-24
EXAM-2018-7-24 未完成 [ ] G 签到水题 A J F A:英文字母有2426个 J:注意long long D:Transit Tree Path 我直接套了单源最短路的一个模板,有 ...
- 如何处理xml文件!看看这里
XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...
- EmguCV从位图(Bitmap)加载Image<Gray,byte>速度慢的问题
先说背景.最近在用C#+EmguCV(其实就是用P/Invoke封闭了OpecCV,与OpenCVDotNet差不多) 做一个视频的东西.视频是由摄像头采集回来的1f/s,2048X1000大小,其实 ...
- bootstrap实现多选项及回显
1.前端 <link rel="stylesheet" href="${ctxStatic}/js/bootstrap-select-1.12.2/dist/css ...
- Nginx笔记总结五:Nginx配置虚拟主机
upstream proxy1 { server ; } upstream proxy2 { server ; } server { listen ; server_name www1.dlab.co ...
- python二叉树及叶节点获取 (面试题)
才疏学浅,智商不够,花了一晚上看了二叉树.记录一下: 1.二叉树的遍历 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍历:左子树->右 ...
- 中心极限定理|z分布|t分布|卡方分布
生物统计学 抽样分布:n个样本会得到n个统计量,将这n个统计量作为总体,该总体的分布即是抽样分布 根据辛钦大数定律,从一个非正态分布的总体中抽取的含量主n的样本,当n充分大时,样本平均数渐近服从正态分 ...
- Luogu_2061_[USACO07OPEN]城市的地平线City Horizon
题目描述 Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at the cit ...
- 吴裕雄--天生自然python学习笔记:beautifulsoup库的使用
Beautiful Soup 库简介 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简 ...