今天学习图像直方图和图像均衡化

一:图像直方图

import cv2
import numpy as np
import matplotlib.pyplot as plt# 图像的直方图,就是统计哪些像素点,或者那一段像素区间的像素的个数
# 在opencv中使用的是 calcHist(images, channels, mask, histSzie, ranges)
# 参数解析:
#       images: 一次性可以传入多个图像。传入图像时候是一个list, 用[]括起来,数据类型是 uint8/float32
#       channels: 统计的是哪个通道,如果是灰度图传入[0],如果是彩色图像,传入[0]、[1]、[2],代表的是 BGR通道
#       mask: 给图像做个掩码,如果想统计这个图像,则是传入None, 如果想只统计一部分,则需要做个掩码传入
#       histSzie: BIN的数量,平均划分成几个范围,如果是一个像素点一个范围的话,就是256.
#       ranges: 像素的范围,通常为[0, 256]# 展示图像,封装成函数
def cv_show_image(name, img):cv2.imshow(name, img)cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止cv2.destroyAllWindows()img = cv2.imread('images/saoge2.jpg')
print(img.shape)
plt.hist(img.ravel(), 256)
plt.title('src_img_hist')
plt.show()# 计算各个通道的直方图
hist_b = cv2.calcHist([img], [0], None, [256], [0, 256])
print(hist_b.shape)  # (256, 1)
hist_g = cv2.calcHist([img], [1], None, [256], [0, 256])
print(hist_g.shape)  # (256, 1)
hist_r = cv2.calcHist([img], [2], None, [256], [0, 256])
print(hist_r.shape)  # (256, 1)# 绘这BGR三个通道的直方图
plt.plot(hist_b, 'b')
plt.plot(hist_g, 'g')
plt.plot(hist_r, 'r')
plt.xlim([0, 256])
plt.title('bgr_hist')
plt.show()# 带有掩码操作,当我们只想取其中部分区域进行直方图统计的时候,就可以用得上掩码
# 掩码是选择的区域是保留,不选择的区域是废弃,因此掩码在选择区域的值是255,丢弃的区域的值是0
# 下面是定义mask掩码的方式
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:540] = 255masked_img = cv2.bitwise_and(img, img, mask=mask)  # 得到亚麻作用后的图像hist_full_img = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask_img = cv2.calcHist([img], [0], mask, [256], [0, 256])plt.subplot(2,2,1), plt.imshow(img, 'gray')
plt.subplot(2,2,2), plt.imshow(mask, 'gray')
plt.subplot(2,2,3), plt.imshow(masked_img, 'gray')
plt.subplot(2,2,4), plt.plot(hist_full_img, 'b'), plt.plot(hist_mask_img, 'g')
plt.xlim([0, 256])
plt.title('mask_hist')
plt.show()

原始图像的灰度直方图是:

原始图像的BGR三通道各自的直方图

原始图像的B带有掩码的B通道直方图

二:直方图均衡化

# 直方图的均衡化
# 得到直方图后,有一些直方图的像素分布不均匀,导致颜色很偏,因此需要均衡化调节
# 图像均衡化得目的是为了提高图像的对比度。对于灰度分布比较集中的图(整体太暗或者太亮),可以起到均衡作用(有明有暗)。
# 方法就是:
#     读入图像
#     对每个通道分别统计像素值[0,255]出现的次数。
#     对每个通道分别求像素值[0,255]出现的概率,得到概率直方图。
#     对每个通道分别求像素值[0,255]概率的累计和,得到累计概率直方图。
#     对每个通道根据累计概率直方图分别求像素映射函数。对每个通道完成每个像素点的映射。
#           举个例子,像素值为56的累计概率是0.2,那么像素值为56的新的映射像素值是 256*0.2=51
#           举个例子,像素值为255的累计概率一定是1,么像素值为255的新的映射像素值是 256*01=255
#     输出直方图均衡化的图像。# 在opencv中的操作
# 读取原始图像
img = cv2.imread('images/saoge2.jpg', cv2.IMREAD_GRAYSCALE)  # 读取灰度图像
plt.hist(img.ravel(), 256)
plt.title('src_img_hist')
plt.show()# 图像直方图均衡化,整个图像都会进行均衡化
equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(), 256)
plt.title('equalizeHist_img')
plt.show()# 自适应均衡化
# 把图像分成一些小格子,各自做各自的均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
res_clahe = clahe.apply(img)res = np.hstack((img, equ, res_clahe))
cv_show_image('equalizeHist', res)

普通均衡化和自适应均衡化的效果对比

【opencv学习】【图像直方图和均衡化】相关推荐

  1. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...

  2. C++ opencv之图像直方图(calcHist)

    这篇博客我们主要来学习图像直方图. 图像直方图是图像像素值的统计学特征.计算代价较小,具有图像平移.旋转.缩放不变性等众多优点,广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割.基于颜色的图像 ...

  3. 【Python OpenCV】图像直方图 calcHist方法 equalizeHist方法

    [Python OpenCV]图像直方图 calcHist方法 equalizeHist方法 (一)图像直方图 图像的构成是有像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图).所谓直方 ...

  4. 使用Python,OpenCV计算图像直方图(cv2.calcHist)

    使用Python,OpenCV计算图像直方图(cv2.calcHist 1. 效果图 2. 原理 2.1 什么是图像直方图? 2.2 计算直方图 2.3 可视化蒙版区域 3. 源码 参考 这篇博客将介 ...

  5. opencv 绘制图像直方图,实现直方图均衡化

    直方图 直方图简单来说就是图像中每个像素值的个数统计,比如说一副灰度图中像素值为0的有多少个,1的有多少个--直方图是一种分析图像的手段: 直方图计算 opencv库计算直方图 使用 cv.calcH ...

  6. Opencv学习笔记——直方图与模板匹配

    文章目录 一.直方图 1.画直方图 2.mask的使用 3.直方图均值化 4.自适应直方图均衡化 二.模板匹配 1.匹配单个对象 2.匹配多个对象 一.直方图 直方图是像素点数值分布的统计图形表示,也 ...

  7. OpenCV之图像直方图

     Fu Xianjun. All Rights Reserved 直方图是图像处理过程中的一-种非 常重要的分析工具.直方图从图像内部灰度级的角度对图像进行表述,包含十分丰富而重要的信息.从直方图的角 ...

  8. opencv中图像直方图常见操作之直方图比较(二)

    图像直方图常见操作(一):https://blog.csdn.net/qq_37120369/article/details/104792427 图像直方图常见操作(三):https://blog.c ...

  9. opencv学习之直方图绘制

    图像直方图就是用表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数,可以借助观察该直方图了解如何调整亮度分布. 直方图意义如下: .直方图是图像中像素强度分布的图形表达式 .它统计了每一个 ...

最新文章

  1. linux驱动:音频驱动(一)ALSA
  2. MAC配置DNS服务器
  3. 如何设置JVM使用的代理
  4. 一个handle使用更新线程的实例
  5. 位运算和时间复杂度的分析
  6. .NET简谈组件程序设计之(手动同步)
  7. VS2008中vss的设置
  8. 靶场练习第二十天~vulnhub靶场之Funbox: Scriptkiddie
  9. JS 利用数组拼接html字符串
  10. python pipline_python中sklearn的pipeline模块实例详解
  11. GD32VF103开发环境简单介绍
  12. Web前端开发工程师需要掌握哪些核心技能?
  13. 16进制颜色转换RGB原理
  14. 2017 上海车牌(沪牌)标书购买攻略
  15. 当443端口被占用时如何解决?
  16. 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash
  17. iconfont 新加图标( 在原有项目的图标库中加入新的图标)
  18. 設計模式之Visitor
  19. Java多线程模拟运动比赛
  20. inter cpu 测试软件,Intel官方CPU检测工具

热门文章

  1. 论文解读:K-BERT:Enabling Language Representation with Knowledge Graph(AAAI-20)
  2. HRNet语义分割训练及TensorRT部署
  3. linux中获取系统时间的几种方法
  4. MapReduce基本概述——分布式计算框架
  5. JSM-ActiveMQ
  6. Google官方Activity介绍
  7. Vue的自学之路(三)
  8. ceil函数和floor函数的用法
  9. 电机控制编程的数学运算优化方案
  10. DRV8872直流电机驱动芯片简要的使用说明