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的类实例属性访问规则探讨
Jan 30 Python
Django验证码的生成与使用示例
May 20 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
Python实现的简单排列组合算法示例
Jul 04 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
基于python实现文件加密功能
Jan 06 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
简单介绍Python的第三方库yaml
Jun 18 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 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 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
javascript实现下雨效果
2017/03/27 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
vue 中的 render 函数作用详解
2020/02/28 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
Python温度转换实例分析
2018/01/17 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
建议书标准格式
2014/03/12 职场文书
给上级领导的感谢信
2015/01/22 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书