比如说,数据集中在000处(左侧)的图像全体会偏暗,数据集中在255255255处(右侧)的图像会偏亮。

如果直方图有所偏向,那么其动态范围( dynamic range )就会较低。

为了使人能更清楚地看见图片,让直方图归一化、平坦化是十分必要的。

这种归一化直方图的操作被称作灰度变换(Grayscale Transformation)。像素点取值范围从[c,d][c,d][c,d]转换到[a,b][a,b][a,b]的过程由下式定义。这回我们将imori_dark.jpg的灰度扩展到[0,255][0, 255][0,255]范围:

import cv2
import numpy as np
import matplotlib.pyplot as pltdef hist_normalization(img, a=0, b=255):c = img.min()d = img.max()out = img.copy()# normalizationout = (b - a) / (d - c) * (out - c) + aout[out < a] = aout[out > b] = bout = out.astype(np.uint8)return out# Read image
img  = cv2.imread("imori_dark.jpg").astype(np.float)
H, W, C = img.shape# histogram normalization
out = hist_normalization(img)# Display histogram
plt.hist(out.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.savefig("out_his.png")
plt.show()cv2.imshow("result", out)
cv2.waitKey(0)
cv2.imwrite("out.jpg", out)

输入:

输出:

直方图:

API

cv2.normalize(src, dst, alpha, beta, norm_type, dtype, mask)

详细:

src-输入数组
dst-输出数组,支持原地运算
alpha-range normalization模式的最小值
beta-range normalization模式的最大值,不用于norm normalization(范数归一化)模式。
normType-归一化的类型,可以有以下的取值:
1. NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用
2. NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
3.NORM_L1 : 归一化数组的L1-范数(绝对值的和)
4.NORM_L2: 归一化数组的(欧几里德)L2-范数
dtype-dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).
mask-操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。

适用于:灰度级主要在0 ~ 150之间,造成图像对比度较低,可用直方图归一化将图像灰度级拉伸到0~255,使其更清晰。

import cv2
import numpy as np
import matplotlib.pyplot as pltif __name__ == '__main__':src = cv2.imread("child.jpg", cv2.IMREAD_ANYCOLOR)dst = np.zeros_like(src)cv2.normalize(src, dst, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)#计算灰度直方图grayHist = cv2.calcHist([src], [0], None, [256], [0, 256])grayHist1 = cv2.calcHist([dst], [0], None, [256], [0, 256])#画出直方图x_range = range(256)plt.plot(x_range, grayHist, 'r', linewidth=1.5, c='black')plt.plot(x_range, grayHist1, 'r', linewidth=1.5, c='b')#设置坐标轴的范围y_maxValue = np.max(grayHist)plt.axis([0, 255, 0, y_maxValue]) #画图范围plt.xlabel("gray Level")plt.ylabel("number of pixels")plt.show()cv2.imshow("src", src)cv2.imshow("dst", dst)cv2.waitKey(0)cv2.destroyWindow()

OpenCV直方图正规化(归一化)相关推荐

  1. 【OpenCV】对比度增强之直方图正规化(归一化)

    原理详解: 假设输入图像为I,高为H.宽为W,I(r,c)代表I的第r行第c列的灰度值,将I中出现的最小灰度级记为Imin,最大灰度级记为Imax,即I(r,c)ϵ[Imin,Imax]\epsilo ...

  2. 基于python的对比度增强(线性变换、直方图正规化、直方图均衡化、CLAHE)

    线性变换 假设输入图像为I,宽为W,高为H,输出图像为O,图像的线性变换可以用以下公式定义: O(r,c)=a×I(r,c)+b,0≤r<H,0≤c<WO(r, c) = a × I(r, ...

  3. 线性变换,分段线性变换,伽马变换,直方图正规化,直方图均衡化,局部自适应直方图均衡化的原理以及python代码

    1.基础概念 1.1 图像灰度直方图 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率.图像的对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度 ...

  4. OpenCV--Python 图像增强(线性变换,直方图正规化,伽马变换,全局直方图均衡化,限制对比度的自适应直方图均衡化)

    图像增强主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来增加清晰.对比度增强有几种常用的方法,如线性变换.分段线性变换.伽马变 ...

  5. opencv 直方图_OpenCV之图像直方图反向投影

    python代码: import cv2 as cv import numpy as np from matplotlib import pyplot as pltdef back_projectio ...

  6. 图像增强:直方图正规化、直方图均衡 (python实现)

    当图像灰度级范围较小时,会造成图像对比度较低的问题.而图像增强则是通过把图像的灰度级范围进行扩大,从而使图像细节看起来更加清晰.下面我们一步一步进行说明. 灰度直方图 直方图是对灰度图像上的灰度值进行 ...

  7. C#调用C++OpenCV直方图匹配

    C#调用C++ OpenCV4.4.0+VS2019 基于OpenCV4.4.0的直方图匹配 直方图比较 相关系数的标准 卡方系数的标准 相交系数的标准 巴氏系数的标准 步骤 直方图匹配原理 直方图匹 ...

  8. R语言plotly可视化:可视化直方图、归一化的直方图、水平直方图、互相重叠的直方图、堆叠的直方图、累积直方图、通过bingroup参数设置多个直方图使用相同的bins设置、自定义直方图条形的间距

    R语言plotly可视化:可视化直方图.归一化的直方图.水平直方图.互相重叠的直方图.堆叠的直方图.累积直方图.通过bingroup参数设置多个直方图使用相同的bins设置.自定义直方图条形的间距 目 ...

  9. OpenCV直方图比较Histogram Comparison

    OpenCV直方图比较Histogram Comparison 直方图比较Histogram Comparison 目标 理论 代码 这个程序做什么? 解释 结果 直方图比较Histogram Com ...

最新文章

  1. Python divmod() 函数
  2. BZOJ 1411Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
  3. 传统的线性降维方法效果不佳。_机器学习西瓜书简明笔记(11)降维与度量学习...
  4. c语言左(<<)右(>>)移
  5. Rust跨界前端全攻略
  6. Hibernate原生SQL查询
  7. mysql新手创建数据库_用MySQL创建数据库和数据库表(新手必看)
  8. 贝壳:月光宝盒的密码(二分查找,暴力破解,动态规划)
  9. 酉矩阵(unitary matrix)
  10. 基于seq2seq自动生成小说
  11. EDK2从搭建到运行
  12. talib实现与通达信、同花顺一致的MACD、KDJ指标
  13. ubuntu安装一些有用的小插件
  14. 终端报错PTY allocation request failed on channel 0
  15. 笔记:TRULY_SPINACH(优酷播单:和我一起用Unity3D玩游戏)
  16. 读懂这些你的婚姻才会幸福
  17. 对不起,让大家久等了,RETURNS!
  18. 系统分析与设计课程知识点总结
  19. CarbonData简介
  20. 人工智能之数学基础篇—高等数学基础(下篇)

热门文章

  1. Stm32F407与W5500用DMA通信
  2. java基础面试题-高级10道
  3. Java如何显示不同字体的文字?
  4. 浙大远程计算机基础知识题库,浙大远程教育1.计算机基础知识题答卷.docx
  5. 解决typescript报错:不能调用可能是未定义的对象
  6. JS(第二十四课)JS高级Es6语法
  7. 被嫌弃的互联网的 “一生”
  8. 手牵手走过喧嚣的人群
  9. uniapp [JS Framework] 当前运行的基座不包含原生插件[sp-tcp],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座
  10. boost中静态库编译没有-fPIC选项的问题解决方案