OpenCV自学笔记25. 直方图均衡化
2017-08-09 21:59
267 查看
OpenCV自学笔记25. 直方图均衡化
1、直方图均衡化的原理
直方图均衡化往往能够使图像的对比度增强,它增强了靠近直方图极大值附近的对比度,减小了极小值附近的对比度。它的数学原理如下(摘自维基百科):
跳过数学原理,其实直方图均衡化的步骤非常简单,看一个例子很容易明白。
下文引用自:http://www.cnblogs.com/tianyalu/p/5687782.html,原作者写得非常清楚,所以就直接引用了
2、直方图均衡化的实现
在实现部分,我分别通过OpenCV中提供的api,以及自己用python写这两种方式验证了直方图均衡化的原理,完整的程序如下。注:我用python写的代码比较差,直接用循环比较好理解,也没有用numpy,所以运行起来比较慢。
opencv实现
python自己动手实现
先来看看效果吧,第一张图是原始的灰度图,第二张是采用OpenCV提供的equalizeHist方法得到的效果图,第三张是自己编写python的效果图。
myhistogram.py
# -*- coding:utf-8 -*- import cv2 import numpy as np ''' 替换像素 old_val : 原始像素值 new_val : 新像素值 image : 要替换像素的图片 ''' def replace(old_val, new_val, image): for i in range(image.shape[0]): for j in range(image.shape[1]): if image[i][j] == old_val: image[i][j] = new_val # 读入图片 image = cv2.imread("images/my_wife2.jpg", 0) # 363 236 cv2.imshow("image", image) # 显示原始图片 # 用OpenCV 提供的equalizeHist方法,进行直方图均衡化 eq = cv2.equalizeHist(image) cv2.imshow("Histogram Equalization", np.hstack([eq])) # 下面自己写直方图均衡化 rows = image.shape[0] cols = image.shape[1] nums = rows * cols bin = [0] * 256 # 分为256个bin,类似桶排序的思想 # 统计个数 for i in range(rows): for j in range(cols): bin[image[i][j]] += 1 # 根据累积概率计算新的灰度值,并替换旧的灰度值 p = 0 for i in range(0, 256): p += bin[i] / nums val = (int)(p * 255) replace(i, val, image) # 显示直方图均衡化后的图像 cv2.imshow("after histogram", image) cv2.waitKey(0)
然后,我绘制了这三张结果图的直方图,如下。可见直方图均衡化相当于将直方图拉伸抻平了。
绘制直方图的代码为:
from matplotlib import pyplot as plt ''' 绘制直方图 代码参考自 http://blog.csdn.net/jnulzl/article/details/47171549 ''' def drawHist(image): # 图像直方图 hist = cv2.calcHist([image], [0], None, [256], [0, 256]) plt.figure() # 新建一个图像 plt.title("Grayscale Histogram") # 图像的标题 plt.xlabel("Bins") # X轴标签 plt.ylabel("# of Pixels") # Y轴标签 plt.plot(hist) # 画图 plt.xlim([0, 256]) # 设置x坐标轴范围 plt.show() # 显示图像
参考:
http://www.cnblogs.com/tianyalu/p/5687782.html
http://blog.csdn.net/superjunenaruto/article/details/52431941
http://blog.csdn.net/jnulzl/article/details/47171549
就这样,拜拜~
相关文章推荐
- OpenCV2.x自学笔记——Qt5.5.1打包exe
- 我的OpenCV学习笔记(25):c++版本的高斯混合模型的源代码完全注释
- 黑马程序员------张孝祥J2SE加强自学笔记(25-40)(转载)
- [opencv自学笔记]绘制直方图和均衡化
- OpenCV自学笔记3:Canny边缘检测
- OpenCV学习笔记(25)基于MFC和OpenCV的摄像机定标与立体匹配测试程序(20140505更新)
- OpenCV 自学笔记33. 计算图像的均值、标准差和平均梯度
- OpenCV自学笔记10:视频中分割出圆形
- [opencv自学笔记]图像滤波
- OpenCV学习笔记_直方图均衡化cvEqualizeHist
- OpenCV自学笔记11. 切割图片
- OpenCV自学笔记29. lsd直线检测算法(未完)
- OpenCV自学笔记14:Harris角点检测实例
- 【OpenCV自学笔记】DYA3 测试旧版本OpenCV函数的使用和图像简单缩放
- opencv学习笔记1—equalizeHist 函数(直方图均衡化)
- OpenCV学习笔记(三):将图像显示在MFC控件上并做直方图均衡化处理
- OpenCV自学笔记18. 基于SVM和神经网络的车牌识别(二)
- OpenCV自学笔记23. Raspberry Pi 安装OpenCV(C++)
- OpenCV自学笔记13. 训练自己的分类器
- OpenCV 2 学习笔记(25): 使用分水岭分割图像