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 连连看连接算法
Nov 22 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
Python IDLE入门简介
Dec 08 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
Oct 23 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
Python必须了解的35个关键词
Jul 16 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
python实现的人脸识别打卡系统
May 08 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开发环境
2015/07/28 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
跟老齐学Python之??碌某?? target=
2014/09/12 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
几道PHP面试题
2013/04/14 面试题
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
老师推荐信
2013/10/28 职场文书
婚庆公司的创业计划书
2014/01/22 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
人力资源管理求职信
2014/08/07 职场文书
中职招生先进个人材料
2014/08/31 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
python实现简单区块链结构
2021/04/25 Python
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle