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编写网页爬虫脚本并实现APScheduler调度
Jul 28 Python
Python制作简单的网页爬虫
Nov 22 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
Python端口扫描简单程序
Nov 10 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
python 操作excel表格的方法
Dec 05 Python
python Protobuf定义消息类型知识点讲解
Mar 02 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中对xml读取的相关函数的介绍一
2008/06/05 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
PHP读取Excel类文件
2017/05/15 PHP
javascript学习网址备忘
2007/05/29 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
Python中逗号的三种作用实例分析
2015/06/08 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
详解python播放音频的三种方法
2019/09/23 Python
python实现画循环圆
2019/11/23 Python
使用python模拟高斯分布例子
2019/12/09 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
报关报检委托书
2014/04/08 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
房产公证书格式
2015/01/26 职场文书
创先争优活动个人总结
2015/03/04 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
Django中session进行权限管理的使用
2021/07/09 Python
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
Python实现信息管理系统
2022/06/05 Python