文章目录

  • 1.直方图
  • 2.直方图均衡化
  • 3.源代码实现直方图均衡化

1.直方图

直方图: (1) 图像中不同像素等级出现的次数 (2) 图像中具有不同等级的像素关于总像素数目的比值。

我们使用cv2.calcHist方法得到直方图

cv2.calcHist(images, channels, mask, histSize, ranges):

-img: 图像
-channels: 选取图像的哪个通道
-histSize: 直方图大小
-ranges: 直方图范围

cv2.minMaxLoc: 返回直方图的最大最小值,以及他们的索引

import cv2
import numpy as np
def ImageHist(image, type):color = (255, 255,255)windowName = 'Gray'if type == 1:       #判断通道颜色类型  B-G-Rcolor = (255, 0, 0)windowName = 'B hist'elif type == 2:color = (0,255,0)windowName = 'G hist'else:color = (0,0,255)# 得到直方图hist = cv2.calcHist([image],[0],None,[256],[0,255])# 得到最大值和最小值minV,maxV,minL,maxL = cv2.minMaxLoc(hist)histImg = np.zeros([256,256,3],np.uint8)#直方图归一化for h in range(256):interNormal = int(hist[h] / maxV * 256)cv2.line(histImg, (h, 256), (h, 256 - interNormal), color)cv2.imshow(windowName, histImg)return histImg
img = cv2.imread('img.jpg', 1)
channels = cv2.split(img) # R-G-B
for i in range(3): ImageHist(channels[i], 1 + i)
cv2.waitKey(0)


2.直方图均衡化

灰色图像直方图均衡化

这里我们直接使用cv2.equalizeHist方法来得到直方图均衡化之后的图像

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dat = cv2.equalizeHist(gray)
cv2.imshow('gray', gray)a
cv2.imshow('dat', dat)
cv2.waitKey(0)

原图像:

直方图均衡化后的图像:

彩色图像直方图均衡化

彩色图像有3个通道,直方图是针对单通道上的像素统计,所以使用cv2.split方法分离图像的颜色通道,分别得到各个通道的直方图,最后使用cv2.merge()方法合并直方图,得到彩色图像的直方图均衡化

import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('img', img)
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
dat = cv2.merge((bH, gH, rH))
cv2.imshow('dat', dat)
cv2.waitKey(0)
D:\Anaconda\lib\site-packages\numpy\_distributor_init.py:32: UserWarning: loaded more than 1 DLL from .libs:
D:\Anaconda\lib\site-packages\numpy\.libs\libopenblas.NOIJJG62EMASZI6NYURL6JBKM4EVBGM7.gfortran-win_amd64.dll
D:\Anaconda\lib\site-packages\numpy\.libs\libopenblas.PYQHXLVVQ7VESDPUVUADXEVJOBGHJPAY.gfortran-win_amd64.dllstacklevel=1)

原图像:

直方图均衡化之后的图像:

3.源代码实现直方图均衡化

下面我们用源代码来实现直方图

横坐标为像素等级,纵坐标为出现的概率

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('img.jpg', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
count = np.zeros(256, np.float)
for i in range(img.shape[0]):for j in range(img.shape[1]):count[int(gray[i, j])] += 1 # 统计该像素出现的次数
count = count / (img.shape[0] * img.shape[1]) # 得到概率
x = np.linspace(0,255,256)
plt.bar(x, count,color = 'b')
plt.show()# 计算累计概率for i in range(1,256):count[i] += count[i - 1]
# 映射
map1 = count * 255
for i in range(img.shape[0]):for j in range(img.shape[1]):p = gray[i, j]gray[i, j] = map1[p]
cv2.imshow('gray', gray)
cv2.waitKey(0)

直方图:

直方图均衡化后的图像:

彩色直方图源码

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('img.jpg', 1)
# R-G-B三种染色直方图
countb = np.zeros(256, np.float32)
countg = np.zeros(256, np.float32)
countr = np.zeros(256, np.float32)for i in range(img.shape[0]):for j in range(img.shape[1]):(b,g,r) = img[i,j]b = int(b)g = int(g)r = int(r)countb[b] += 1 # 统计该像素出现的次数countg[g] += 1countr[r] += 1
countb = countb / (img.shape[0] * img.shape[1]) # 得到概率
countg = countg / (img.shape[0] * img.shape[1])
countr = countr / (img.shape[0] * img.shape[1])
x = np.linspace(0,255,256)
plt.figure()
plt.bar(x, countb,color = 'b')
plt.figure()
plt.bar(x, countg,color = 'g')
plt.figure()
plt.bar(x, countr,color = 'r')
plt.show()# 计算直方图累计概率
for i in range(1,256):countb[i] += countb[i - 1]countg[i] += countg[i - 1]countr[i] += countr[i - 1]
#映射表
mapb = countb * 255
mapg = countg * 255
mapr = countr * 255dat = np.zeros(img.shape, np.uint8)
for i in range(img.shape[0]):for j in range(img.shape[1]):(b,g,r) = img[i, j]dat[i, j] = (mapb[b],mapg[g],mapr[r])
cv2.imshow('dat', dat)
cv2.waitKey(0)

R-G-B 3 种颜色通道的直方图如下:



图像均衡化之后的结果:

OpenCV:利用python来实现图像的直方图均衡化相关推荐

  1. 利用OpenCV的函数equalizeHist()对图像作直方图均衡化处理

    如果一幅图像的灰度值集中在某个比较窄的区域,则图像的对比度会显得比较小,不便于对图像的分析和处理. 图像的直方图均衡化可以实现将原图像的灰度值范围扩大,这样图像的对比度就得到了提高,从而方便对图像进行 ...

  2. python opencv 直方图均衡_OpenCV-Python教程(10、直方图均衡化)

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV和NumP ...

  3. 利用python进行png图像的读写操作

    利用python进行png图像的读写操作 最近遇到了对png灰度图像进行读取,并统计图像中众数的需求,现将代码记录如下.ps:适用于单波段图,形如(X,Y). 1.导入需要的包 import matp ...

  4. 【OpenCV入门指南】第九篇 灰度直方图均衡化

    <OpenCV入门指南>系列文章地址: http://blog.csdn.net/morewindows/article/category/1291764 转载请标明出处,原文地址:htt ...

  5. OpenCV学习笔记(九)之直方图均衡化(图像增强)

    图像直方图 1.图像直方图介绍   图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数.可以借助观察该直方图了解需要如何调整亮度分布.这种 ...

  6. Matlab中的histeq函数——图像灰度直方图均衡化

    首先来看一下没有进行灰度直方图均衡化的图片和经过灰度直方图均衡化后的图片的对比: 左为原图,右为经过灰度直方图均衡化处理后的图片,很显然,经过处理之后的图片在对比度方面有了显著的提升,下面附上两张图片 ...

  7. 使用openCV画出一幅图像的直方图

    // 对单通道图像做直方图 // #include "cv.h" #include "highgui.h" #include <stdio.h> # ...

  8. python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...

  9. 基于MATLAB对低照度图像进行直方图均衡化和同态滤波操作

    资源下载地址:https://download.csdn.net/download/sheziqiong/85897108 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. “一百万行Python代码对任何人都足够了”
  2. 算法----计算机程序设计之魂
  3. Quartz快速入门
  4. LINUX 内存使用情况
  5. 建立管理SQL Server登录帐户
  6. python3的pyqt5 qtablewidget按数据大小排列_InnoDB为什么要选择B+树来存储数据?
  7. apache mediawiki 安装_MediaWiki初探:安装及使用入门
  8. Jquery第二章常用方法,一二级菜单淡入淡出,event事件,复选框的全选反选第一节
  9. 蓝桥杯2016年七届C/C++省赛C组第一题-报纸页数
  10. Linux安装MATLAB Compiler Runtime操作
  11. 解决android sdk manage打开闪退的解决方法
  12. 小众却非常好用的文件同步备份工具-FileYee
  13. Vim命令大全(linux)
  14. 宗海图cad_技术绘制论文,关于CAD技术机械制图关键技术相关参考文献资料-免费论文范文...
  15. 添加透明FLASH和FLASH大全
  16. 长视频优化:如何高效减少转码耗时
  17. CSS技能点--带图标的标题栏
  18. xss.haozi.me
  19. repeated pB
  20. python动态网页爬取——四六级成绩批量爬取

热门文章

  1. [心跳] 互联网推送服务原理:长连接+心跳机制
  2. 爱情九十三课,指尖情话
  3. 提高编程技巧的十大方法
  4. 在打包的时候,创建应用程序池,并自动将程序assign到新创建的池中(MSI制作)
  5. html 图片隐藏 一部分,如何在HTML / CSS中仅显示图像的一部分?
  6. angualr Http error处理
  7. vue中的provide/inject的学习使用
  8. (九)Hibernate 检索策略
  9. Java Synchronized 关键字
  10. Sharepoint2013搜索学习笔记之自定义查询规则(十)