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

主要完成了以下的实操:

  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. labview实例_手把手以实例教你学LabVIEW编程,条件结构编程方法
  2. 整理了Linux常用命令变量
  3. Javascript——声明提升(函数、变量提升)
  4. windows 10 删除Linux系统方法
  5. 用matlab分析系统工程案例,系统工程ISMmatlab代码.doc
  6. VC++调试方法和技巧
  7. 1001 害死人不偿命的(3n+1)猜想 (15)
  8. waiting for lock on working directory of:tortoiseHg
  9. MixGo V1.0 发布,混合型高性能 Go 框架
  10. 容大热敏打印机打印纸张出半截,测试页不出嗡嗡响
  11. 微信小程序自定义拍照和H5调用摄像头拍照
  12. 贪吃蛇c加加代码_C语言/C加加编程学习之贪吃蛇小游戏源代码
  13. 中南大学2020大学生心里健康教育答案 —— 雨课堂
  14. 正态性检验ks和sw区别_t检验常见问题汇总解答,你想知道的都在这里
  15. 图片怎么转文字?这些方法值得收藏
  16. 数据分析中的专业术语
  17. C语言将华氏温度转换为摄氏温度
  18. Redis学习笔记-GEO经纬度编码原理地理划分
  19. 蓝天保卫战-环保用电监管云平台(安科瑞 须静燕)
  20. 将DDS集成到AUTOSAR Adaptive平台

热门文章

  1. Mac壁纸软件 - 动态 高清 炫酷 4K 精美壁纸下载
  2. python建立英文语料库_使用NLTK创建新的语料库
  3. css3中的@font-face你真的了解吗
  4. windows10安装masscan
  5. php7版本号,discuz的php7版本号
  6. Matlab使用sort进行排序---2022/04/07
  7. 微信小程序轮播图(详细)
  8. PMP估算方法对比:参数估算、类比估算、自下而上估算、三点估算和粗略量级估算
  9. 线性回归之最小二乘法公式推导和原理介绍
  10. HashMap hash冲突解决方法