今天,花了些时间研究了一下直方图和直方图均衡化的一些操作,对我这个小白来说,虽然是原理简单的知识,但在实操时却遇到很多问题,真实不太容易,所以这里记录一下。

主要完成了以下的实操:

  1. 直方图的处理

    1. cv2处理直方图(灰度图和彩图)
    2. pyplot处理直方图(灰度图和彩图)
  2. 直方图均衡化
    1. 灰度图均衡化
    2. 彩图均衡化
    3. 均衡化自实现,并于cv结果比较

下面详细来大概记录一下。

直方图展示(灰度图和彩图)

对于直方图的处理,有cv2和pyplot2种常用的方式,接口定义分别为

cv2.calcHist()和plt.Hist(),这部分就是理解现有接口定义,直接调用即可,直接上代码。

'''calcHist—计算图像直方图函数原型:calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)images:图像矩阵,例如:[image]channels:通道数,例如:0mask:掩膜,一般为:NonehistSize:直方图大小,一般等于灰度级数ranges:横轴范围
'''import cv2
import matplotlib.pyplot as pltcolor = cv2.imread("..//..//dataset//lena.png", 1)
cv2.imshow('color', color)
gray = cv2.cvtColor(color, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)img_Gray = cv2.imread('..//..//dataset//lena.png', cv2.IMREAD_GRAYSCALE)
# cv2.cvtColor(img)
cv2.imshow('lenaGray', img_Gray)'''cv2操作直方图'''
# 这里注意,全部的参数,都要[]形式,否则数据不正确
# cv2 灰度直方图
cv2_hist = cv2.calcHist([img_Gray], [0], None, [256], [0, 255])
plt.plot(cv2_hist)
plt.show()# cv2 各通道彩色直方图
color_hist0 = cv2.calcHist([color], [0], None, [256], [0, 255])
color_hist1 = cv2.calcHist([color], [1], None, [256], [0, 255])
color_hist2 = cv2.calcHist([color], [2], None, [256], [0, 255])
plt.plot(color_hist0)
plt.plot(color_hist1)
plt.plot(color_hist2)
plt.show()'''plt直接显示直方图'''
# 灰度直方图
plt.hist(img_Gray.ravel(), 256)
plt.show()# 彩色直方图
# 彩色直方图
plt.hist(color[:, :, 0].ravel(), 256)
plt.hist(color[:, :, 1].ravel(), 256)
plt.hist(color[:, :, 2].ravel(), 256)
plt.show()cv2.waitKey(0)
cv2.destroyAllWindows()

这里需要特别注意一下的是,calcHist的参数,所有的参数都以[]形式进行传递,当mask为None时,直接以None替代,否则,结果不正确。

上面只是使用pyplot简单展示了数据,关于pyplot的使用,其实可以做到很多好看的样式,有需要的同学可以去学习一下。


然后,主要说一下直方图均衡化的操作,因为在实际运用种,均衡化是用的较多的。

操作其实也简单,直接调用接口即可,上代码看一下


img = cv2.imread('..//..//dataset//lena.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# gray图像均衡化
dst = cv2.equalizeHist(gray)
hist_src = cv2.calcHist([gray], [0], None, [256], [0, 255])
hist_dst = cv2.calcHist([dst], [0], None, [256], [0, 255])
# plt.plot(hist_dst)
# plt.show()
# print(type(hist_src))
cv2.imshow('hist_origin_Equalization', np.hstack([gray, dst]))# 多通道图像均衡化
# 注意该方法只能对单通道图像进行处理,因此,对多通道图像需要先split进行处理,之后再merge进行合并
(sb, sg, sr) = cv2.split(img)
db = cv2.equalizeHist(sb)
dg = cv2.equalizeHist(sg)
dr = cv2.equalizeHist(sr)dstImg = cv2.merge((db, dg, dr))
cv2.imshow('EqualizationImage', np.hstack([img, dstImg]))# cv2.waitKey(0)
# cv2.destroyAllWindows()

这里我们提一下,均衡化操作,对应的都是单通道数据,因此,如果是彩色图片进行处理时,我们可以通过split()函数先将其拆分,处理完成后,再通过merge()函数将其合并即可。

这里,附上结果图看一下,可以看到,效果还是蛮明显的。


到这里后,需要想要详细理解均衡化的原理,可以试着自己实现一下均衡化操作。

下面,是我自己实现的均衡化操作,过程种的变量是随意定义的,可以根据流程理解一下

# 自实现均衡化
# 排序-求对应数量-求累计数量-计算结果-生成目标图像
def histEqualization(img):points = list(img.flatten())sets = list(set(points))sets.sort()  # 默认升序point_count = [points.count(i) for i in sets]sum = [np.sum(point_count[0:i]) for i in range(len(point_count))]level = [i / len(points) for i in sum]# 很多推导公式,这里显示是(比例*256)-1,这样会得到很多的负值情况,但我认为直接*256即可,因为其取值范围已经是256个了。dp = [int(l * 256) for l in level]dst = [dp[sets.index(i)] for i in points]dstImg = np.array(dst,np.uint8).reshape((img.shape[0], img.shape[1]))return dstImg# 自实现均衡化方法
dstCustom=histEqualization(gray)
cv2.imshow('customEqualization',dstCustom)
# 从比较结果可以看出自实现的效果和cv的效果还是有很大差别的。
print(np.sum(dstCustom==dst))
print(np.sum(dstCustom.flatten()==dst.flatten()))
# 彩色图像分开调用多次即可

这里的话,提2点:

1.通过我自定义的方法实现的结果与cv的结果有较大的却别,图像只有200多点相同(应该是cv做了一些优化操作),但整体效果看着几乎没差别。

2.在实际使用时,推荐使用cv方法直接处理。

3.关于list的sort操作,其sort是针对自身list进行,可以排序后赋值给其他变量,但不能将排序直接赋值给新变量,这样返回为None

a=[1,2,3,4,5]
a.sort(reverse=Ture)
c=a
# 此时,c与a相同,均为[5,4,3,2,1]b=a.sort()
# 此时,b为None,不能直接赋值

以上即今天的全部内容,感觉对基础不熟悉,在实操时影响真的很大,还是得注重平时多练习,也得加强一下对python得掌握了,虽然简单,但实际开发应用与简单得语法测试还是天差地别的,加油!

直方图与直方图均衡化相关推荐

  1. OpenCV(十九)直方图(直方图计算、掩膜、均衡化、自适应均衡化)

    目录 一.基础理论 1.原理及作用 2.专业术语 二.直方图计算 函数介绍: 1.灰度图 代码: 效果: 2.彩色图 代码: 三.直方图掩膜的应用(mask) 1.基础理论 2.代码 3.效果 四.直 ...

  2. OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配

    直方图均衡化 目标 在这个教程中你将学到: 什么是图像的直方图和为什么图像的直方图很有用 用OpenCV函数 equalizeHist 对图像进行直方图均衡化 原理 图像的直方图是什么? 直方图是图像 ...

  3. opencv进阶学习笔记7:直方图,直方图均衡化,直方图比较,直方图反向投影

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 直方图基础讲解: opencv学 ...

  4. matlab 增加图像对比度_计算机视觉学习笔记6 图像直方图与直方图均衡化

    图像的直方图 图像直方图表示图像中每一种像素的个数,反映了图像中每种像素值出现的频率,是图像的基本统计特征之一,具有平移,旋转,缩放不变性,广泛应用于图像处理的各个领域.比如灰度图像的阈值分割,基于颜 ...

  5. matlab title多个标题_MATLAB中的直方图处理及均衡化

    直方图是多种空间域处理技术的基础.仿图操作能有效地用于图像增强,直方图固有的信息在其他图像处理应用中也是非常有用的,如图像压缩与分割.訪图在软件中易于计算,也适用于商用硬件设备,因此直方图成为实时图像 ...

  6. 灰度直方图及直方图均衡化的MATLAB实现

    文章和代码以及样例图片等相关资源,已经归档至[Github仓库:digital-image-processing-matlab]或者公众号[AIShareLab]回复 数字图像处理 也可获取. 文章目 ...

  7. Matlab数字图像处理 02 灰度变化(图像直方图、直方图均衡化、直方图匹配)

    第二章 灰度变化 2.1 图像的亮度.对比度和动态范围 2.1.1 亮度 2.1.2 对比度 2.1.3 动态范围 2.2 线性灰度变换 2.2.1 具有饱和处理的线性灰度变换 2.2.2 分段线性灰 ...

  8. python-opencv 图像处理基础 (五)颜色直方图+直方图均衡化+直方图比较+直方图反向投影

    1.颜色直方图 #-------------------------------绘制颜色直方图------ import cv2 import numpy as np import matplotli ...

  9. opencv:灰色和彩色图像的像素直方图及直方图均值化的实现与展示

    直方图及直方图均值化的理论,实现及展示 直方图: 首先,我们来看看什么是直方图: 理论概念: 在图像处理中,经常用到直方图,如颜色直方图.灰度直方图等. 图像的灰度直方图就描述了图像中灰度分布情况,能 ...

  10. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波7 - 直方图处理 - 直方图、归一化直方图

    目录 直方图处理 直方图处理 令rk,k=0,1,2,-,L−1r_k, k=0, 1, 2, \dots, L-1rk​,k=0,1,2,-,L−1表于一幅LLL级灰度数字图像f(x,y)f(x,y ...

最新文章

  1. ubuntu联网经常掉线的解决方法
  2. 配置Cisco ASA and Cisco *** Client 4.x with Windows 2003 IAS RADIUS Authentication
  3. 对于flat_interface与public_interface的理解
  4. 在.Net环境下使用elasticsearch实现大数据量的搜索
  5. 三星为什么要卖芯片?手机干不过华为小米,半导体好挣钱!
  6. 又论社区风气, 与程序员是干嘛地的.
  7. STM32(三)-------流水灯(标准库函数)
  8. Expression Blend4 中文
  9. (转)献给迷茫中的量化工作者
  10. 读书摘要——矇矇的秘密基地(关于DODAF)
  11. 2019新版c智播客h马程序员H5全栈工程师培训项目实战
  12. gmail不支持html格式,gmail邮箱附件如何以html格式查看
  13. ElasticSearch7.3.0 集群搭建及配置安全认证
  14. VMwareESX常用命令和IP地址修改
  15. 功放限幅保护_更改限幅电路的功放清单
  16. QT程序启动画面gif动画有静止背景的解决方法
  17. ubuntu双系统安装教程
  18. vue-map高德地图(1)输入坐标显示位置(组件封装)
  19. [附源码]Python计算机毕业设计房地产销售系统
  20. 【Python 第16课】 字符串格式化

热门文章

  1. 浅析View的事件分发机制
  2. java 前端ui框架_5 个优秀前端 UI 框架
  3. 破解app 在so层的密钥key
  4. 轻松斩断信息安全黑手!就这?
  5. SQL往表里添加字段
  6. 学习笔记之30个常用的maven命令
  7. matlab分析电路,基于Matlab的电路节点分析法
  8. 1那智机器人主电连接
  9. GitHub桌面版的下载安装及使用
  10. android9.0官方下载,安卓9.0系统刷机包下载