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 生成目录树及显示文件大小的代码
Jul 23 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
Python AES加密实例解析
Jan 18 Python
如何用python整理附件
May 13 Python
python3.5基于TCP实现文件传输
Mar 20 Python
python 3.6.4 安装配置方法图文教程
Sep 18 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
Python日志无延迟实时写入的示例
Jul 11 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
anaconda python3.8安装后降级
Jun 11 Python
Python3.8官网文档之类的基础语法阅读
Sep 04 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
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
php array_walk() 数组函数
2011/07/12 PHP
PHP可变函数的使用详解
2013/06/14 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
简单谈谈PHP vs Node.js
2015/07/17 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
简单介绍Python中的JSON使用
2015/04/28 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
Python中pillow知识点学习
2018/04/30 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
Python读写文件基础知识点
2019/06/10 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
人力资源管理毕业生自荐信
2013/11/21 职场文书
培训讲师邀请函
2014/01/10 职场文书
《灯光》教学反思
2014/02/08 职场文书
就职演讲稿范文
2014/05/19 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
八项规定对照检查材料
2014/08/31 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
小学感恩主题班会
2015/08/12 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS