热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenCV利用python来实现图像的直方图均衡化

这篇文章主要介绍了OpenCV利用python来实现图像的直方图均衡化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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)

原图像:

在这里插入图片描述

直方图均衡化后的图像:

在这里插入图片描述

彩色图像直方图均衡化

彩色图像有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)

原图像:

在这里插入图片描述

直方图均衡化之后的图像:

在这里插入图片描述

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)

直方图:

在这里插入图片描述

直方图均衡化后的图像:

在这里插入图片描述

彩色直方图源码

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 直方图均衡化内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了在Pygame中使用矩形对表面进行涂色的方法。通过查阅Pygame文档中的blit函数,可以了解到如何将一个表面的特定部分复制到另一个表面的指定位置上。具体的解决方法和参数说明在文中都有详细说明。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Python异常的捕获、传递与抛出操作,并提供了相关的操作示例。通过异常的捕获和传递,可以有效处理程序中的错误情况。同时,还介绍了如何主动抛出异常。通过本文的学习,读者可以掌握Python中异常处理的基本方法和技巧。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
author-avatar
撩人无聊的青春
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有