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

当γγ等于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的资料请关注脚本之家其它相关文章!

opencv图像增强python_python 基于opencv实现图像增强相关推荐

  1. [OpenCV实战]47 基于OpenCV实现视觉显著性检测

    人类具有一种视觉注意机制,即当面对一个场景时,会选择性地忽略不感兴趣的区域,聚焦于感兴趣的区域.这些感兴趣的区域称为显著性区域.视觉显著性检测(Visual Saliency Detection,VS ...

  2. opencv 全景 android,基于OpenCV的Android手机全景图像拼接技术研究

    摘要: 21世纪是信息化时代,人们每天被各式各样的信息所包围,这些信息中90%来自于图像.在生活中很多情况下,人们需要记录某些场景,常用的工具就是相机,包括带拍照功能的智能手机.随着科技的发展,软硬件 ...

  3. python opencv 连通域_基于OpenCV及连通域分析进行文本块分割

    上一次通过投影的方式进行了文本块分割,但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不能倾斜,而且对噪声比较敏感.还是拿上一回的图片,但是我在上面加了一个比较大的字,得出的结果就有问题了: ...

  4. opencv三维重建_基于OpenCV和C++的多视图三维重建

    前两张图采用本质矩阵计算RT的方法,然后三角测量计算三维坐标.具体原理可以百度. 后面的增量图采用PnP的方法.通过计算图2图3匹配点和图1图2匹配点的公共部分,而图1和图2已经重建完成了,这些公共部 ...

  5. 【Opencv探索】基于OpenCV的“图像拼接特效”(这效果很实用啊)

    前言 家好!我是梨子同学! 希望大家多多支持我!哈哈 为了感谢每一个关注我的小可爱:

  6. 图像增强——基于OpenCV的图像色彩增强

    前言 这是一个增强图像色彩的demo,基于OpenCV,能很好的增强与锐化图像中的色彩. 色彩增强 1.代码 void colorEnhancement(cv::Mat &src, cv::M ...

  7. 【OpenCV 例程200篇】50. 图像增强—直方图统计量图像增强

    [OpenCV 例程200篇]50. 图像增强-直方图统计量图像增强 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  8. 【OpenCV 例程200篇】49. 图像增强—局部直方图处理

    [OpenCV 例程200篇]49. 图像增强-局部直方图处理 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像直 ...

  9. 【OpenCV 例程200篇】51. 图像增强—直方图反向追踪

    [OpenCV 例程200篇]51. 图像增强-直方图反向追踪 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像直 ...

最新文章

  1. B站项目资源过于敏感,2h后删,抓紧保存!!!
  2. Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上
  3. java 与 php lajp_LAJP
  4. 通过SWD J-Link使用J-Link RTT Viewer来查看打印日志
  5. android 读取文件相关
  6. Vue项目实战04 : Vue 轮询接口的实现
  7. Singleton 和 Monostate 模式
  8. 理论基础 —— 栈 —— 双端栈
  9. AutoCAD2004启动时出现fail to get CommcntrController的怎么办
  10. 什么时候使用resulttype_ResultMap和ResultType在使用中的区别
  11. 华为鸿蒙系统是否应该上线,华为鸿蒙系统上线,仅2家国产品牌支持,爆冷?...
  12. 显著性目标检测matlab代码_YOLO v3 目标检测终篇(附完整 GitHub 代码)
  13. H5手写板电子签名开发
  14. elasticsearch6.4.3实现搜索同义词
  15. txt电子书如何用安卓手机完美打开?
  16. 计算矩阵行列式时奇排列与偶排列的判定
  17. [iOS开发]高德地图SDK
  18. python 游戏辅助脚本,python写游戏脚本辅助作范文
  19. 一个随机的抽答的小程序
  20. android照片美颜项目_照片美颜p图编辑app下载

热门文章

  1. 使用FDM(free download manager)要小心损坏笔记本电池
  2. supercharge快充_华为发布 SuperCharge 超级快充充电器:3 USB 接口
  3. office 安装失败的解决办法
  4. 实用!清空了回收站怎么恢复误删的文件?教你这2招!
  5. vue3 访问数据库中的数据
  6. 数据科学家、数据工程师、数据分析师的区别有什么
  7. python循环嵌套三角形_python使用while、for及循环嵌套实现直角三角形及正、倒金字塔...
  8. ctf密码学习题总结
  9. React-native初次运行红屏问题
  10. tableau 有条件的设置文本颜色