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 StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
Python定义二叉树及4种遍历方法实例详解
Jul 05 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
Python Flask框架模板操作实例分析
May 03 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
python实现按首字母分类查找功能
Oct 31 Python
Python实现RGB与HSI颜色空间的互换方式
Nov 27 Python
Django xadmin安装及使用详解
Oct 26 Python
Django模型层实现多表关系创建和多表操作
Jul 21 Python
python index() 与 rindex() 方法的使用示例详解
Dec 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访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
php 短链接算法收集与分析
2011/12/30 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
跟混乱的页面弹窗说再见
2019/04/11 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
微信小程序实现可长按移动控件
2020/11/01 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
python @property的用法及含义全面解析
2018/02/01 Python
Python中的枚举类型示例介绍
2019/01/09 Python
Python 支持向量机分类器的实现
2020/01/15 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
python基于opencv 实现图像时钟
2021/01/04 Python
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
shell程序中如何注释
2012/02/17 面试题
软件配置管理有什么好处
2015/04/15 面试题
《白鹅》教学反思
2014/04/13 职场文书
生态养殖创业计划书
2014/05/06 职场文书
物流专业自荐信
2014/05/23 职场文书
走群众路线学习笔记
2014/11/06 职场文书
个人工作年终总结
2015/03/09 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
中学总务处工作总结
2015/08/12 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android
Redis基本数据类型String常用操作命令
2022/06/01 Redis