OpenCV利用python来实现图像的直方图均衡化


Posted in Python onOctober 21, 2020

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-R
    color = (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)

OpenCV利用python来实现图像的直方图均衡化

OpenCV利用python来实现图像的直方图均衡化

OpenCV利用python来实现图像的直方图均衡化

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)

原图像:

OpenCV利用python来实现图像的直方图均衡化

直方图均衡化后的图像:

OpenCV利用python来实现图像的直方图均衡化

彩色图像直方图均衡化

彩色图像有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.dll
stacklevel=1)

原图像:

OpenCV利用python来实现图像的直方图均衡化

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

OpenCV利用python来实现图像的直方图均衡化

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)

直方图:

OpenCV利用python来实现图像的直方图均衡化

直方图均衡化后的图像:

OpenCV利用python来实现图像的直方图均衡化

彩色直方图源码

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] += 1
    countr[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 * 255

dat = 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来实现图像的直方图均衡化

OpenCV利用python来实现图像的直方图均衡化

OpenCV利用python来实现图像的直方图均衡化

图像均衡化之后的结果:

OpenCV利用python来实现图像的直方图均衡化

到此这篇关于OpenCV利用python来实现图像的直方图均衡化的文章就介绍到这了,更多相关OpenCV 直方图均衡化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
Python基于列表list实现的CRUD操作功能示例
Jan 05 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
Apr 10 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
Python将string转换到float的实例方法
Jul 29 Python
NumPy排序的实现
Jan 21 Python
python 基于opencv实现图像增强
Dec 23 Python
Python基础之字符串格式化详解
Apr 21 Python
Python入门之基础语法详解
May 11 Python
Python基础学习之奇异的GUI对话框
May 27 Python
Python实现手势识别
Oct 21 #Python
利用Python优雅的登录校园网
Oct 21 #Python
python 使用三引号时容易犯的小错误
Oct 21 #Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
Oct 21 #Python
基于python爬取链家二手房信息代码示例
Oct 21 #Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 #Python
Python为何不支持switch语句原理详解
Oct 21 #Python
You might like
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
PHP数据类型的总结分析
2013/06/13 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
php防止sql注入的方法详解
2017/02/20 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
PHP查询分页的实现代码
2017/06/09 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
Python中操作mysql的pymysql模块详解
2016/09/13 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
python集合是否可变总结
2019/06/20 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
python生成大写32位uuid代码
2020/03/03 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
公司活动邀请函
2014/01/24 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
浅谈Redis缓冲区机制
2022/06/05 Redis