python之图像直方图

1 图像直方图

1.1 直方图定义

  1. 定义:横坐标:图像中各个像素点的灰度级 ;纵坐标:就有该灰度级的像素个数
  2. 归一化直方图:横坐标:图像中各个像素点的灰度级 ;纵坐标:出现这个灰度的概率

2 pyplot绘制直方图

  • pyplot提供了类似matlab的绘图框架 ,import matplolib.pyplot as plt,函数hist(数据源,像素级)
  • 功能:根据数据源以及像素级绘制直方图 数据源:图像,必须是一维数组 函数ravel b=a.ravel()
  • 功能:将多维数组降为一维数组
  • 格式:一维数组=多维数组.revel() 像素级:一般是256,指[0, 255]

3 opencv绘制直方图

  • 统计直方图函数 calcHisthist = cv2.calcHist(images, channels, mask,histSize, ranges,accumulate)
  • 参数
    Images:原始图像
    Channels:指定通道,通道编号需要用中括号括起来,输入图像是灰度图时,它的值为[0];彩色图像可以使[0],[1],[2]分别对应通道B,G,R。
    •mask:掩码图像,统计整幅图像的直方图,设为None;统计图像某一部分的直方图时,需要掩码图像
  • 生成掩码图像的操作
mask = np.zeros(image.shape, np.uint8)
		mask[200:400, 200:400] = 255
  • histSize:BINS的数量
  • ranges:像素值返回RANGE;像素值范围,例如:[0, 255]
  • Accumulate:累计标识;默认值为false;如果被设置为true,则直方图在开始分配时不会被清零,该参数允许从多个对象中计算单个直方图,或者用户实施更新直方图;多个直方图的累计结果,用户对一组图像计算直方图
  • 返回值 Hist:直方图,使用pyplot绘制
  • 生成掩膜图像
例如:mask = np.zero(800, np.uint8)
mask[300:500, 300:500] = 255
masked_img = cv2.bitwise_and(img, mask)

4 直方图均衡化

  • 理论基础
    前提: 如果一幅图像占有全部可能的灰度级,并且均匀分布。
    结论: 该图像具有高对比度和多变的灰度色调
    外观: 图像细节丰富,质量更高
  • 算法
    计算累计直方图
    将累计直方图进行区间转换
    在累计直方图中,概率相近的原始值,会被处理为相同的值
  • 应用场合
    医疗图像处理;车牌识别;人脸识别
  • 均衡化函数equalizeHist dst = cv2.equalizeHist(src) (灰度图)
    参数 src : 源图像
    返回值 dst : 目标图像,处理结果
  • 分栏函数subplot subplot(nrows, ncols, plot_number) 参数 nrows : 行号 ncols :
    列号 plot_number : 窗口序号
•示例: subplot(2, 3, 4)
•特例: 当每一个参数都小于10时,可以直接书写三个数字,表示为subplot(234)

4 实例

#!/usr/bin/env python
# encoding: utf-8
# @Time    : 2020/8/8 11:18
# @Author  : yq
# @Site    : 
# @File    : tutorial_7.py.py
# @Software: PyCharm

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
# 使用plt绘制直方图
def hist_demo(image):
    plt.hist(image.ravel(),255)
    plt.show()

# 彩色图像直方图
def calcHist_color_demo(image):
    histb = cv.calcHist([image], [0], None, [256], [0, 255])
    histg = cv.calcHist([image], [1], None, [256], [0, 255])
    histr = cv.calcHist([image], [2], None, [256], [0, 255])
    plt.plot(histb, color = "b")
    plt.plot(histg, color = "g")
    plt.plot(histr, color = "r")
    plt.show()


# 灰色图像直方图
def calcHist_gray_demo(image):
    histb = cv.calcHist([image], [0], None, [256], [0, 255])
    plt.plot(histb, color="b")
    plt.show()

# 绘制掩码直方图
def caicHist_mask_demo(image):
    # 显示灰度图
    image = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    plt.subplot(221)
    plt.imshow(image,plt.cm.gray)
    # 显示掩码
    mask = np.zeros(image.shape, np.uint8)
    mask[20:40, 20:40] = 255
    plt.subplot(222)
    plt.imshow(mask,plt.cm.gray)
    # 掩码绘制直方图
    histMI = cv.calcHist([image], [0], mask, [256], [0, 255])
    plt.subplot(223)
    plt.plot(histMI, color="b")
    # 全部图像绘制直方图
    histImage = cv.calcHist([image], [0], None, [256], [0, 255])
    plt.subplot(224)
    plt.plot(histImage, color="r")
    plt.show()

# 均衡化直方图(对比)
def equ_demo(img):
    img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    equ = cv.equalizeHist(img)
    plt.subplot(2,2,1)
    plt.imshow(img, plt.cm.gray)
    plt.axis('off')
    #
    plt.subplot(222)
    plt.hist(img.ravel(), 256)

    plt.subplot(223)
    plt.imshow(equ, plt.cm.gray)
    plt.axis('off')

    plt.subplot(224)
    plt.hist(equ.ravel(), 256)
    plt.show()


src = cv.imread("C:/Users/Administrator/Pictures/tt.png")
# cv.imshow("inputWindows", src)
caicHist_mask_demo(src)
cv.waitKey(0)
cv.destroyAllWindows();
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值