python+opencv绘制直方图

文章目录

  • 直方图定义
  • 归一化直方图
  • DIMS: 使用参数的数量
  • 直方图绘制方法
    • pyplot绘制直方图
    • opencv绘制直方图
  • 生成掩膜图像
  • 直方图均衡化
  • 实例
    • 使用pyplot绘制直方图
    • 使用calcHist生成灰度图像直方图
    • 使用calcHist生成彩色图像直方图
    • 绘制掩码直方图
    • 生成掩膜图像
    • 图像直方图均衡化
    • pyplot显示彩色图像

直方图定义

  • 横坐标:图像中各个像素点的灰度级
  • 纵坐标:就有该灰度级的像素个数

归一化直方图

  • 横坐标:图像中各个像素点的灰度级
  • 纵坐标:出现这个灰度的概率

DIMS: 使用参数的数量

  • dims = 1
    • 灰度直方图,仅仅一件事情,仅仅考虑灰度的情况
  • BINS: 参数子集的数目

直方图绘制方法

pyplot绘制直方图

  • pyplot提供了类似matlab的绘图框架

    • import matplolib.pyplot as plt
  • 函数hist hist(数据源,像素级)

    • 功能: 根据数据源合金像素级绘制直方图
    • 数据源: 图像,必须是一维数组
      • 函数ravel b = a.ravel()
        • 功能: 将多维数组降为一维数组
        • 格式: 一维数组=多维数组.revel()
    • 像素级: 一般是256,指[0, 255]

opencv绘制直方图

  • 统计直方图函数 calcHist
    hist = 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绘制

生成掩膜图像

计算结果 = cv2.bitwise_and(图像1, 图像2)
  • 例如:
    mask = np.zero(800, np.uint8)
    mask[300:500, 300:500] = 255
    masked_img = cv2.bitwise_and(img, mask)
    

直方图均衡化

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

实例

使用pyplot绘制直方图

import cv2
import matplotlib.pyplot as plt

o = cv2.imread("/home/forrest/图片/lena彩图.png", cv2.IMREAD_GRAYSCALE)
cv2.imshow("o", o)

plt.hist(o.ravel(), 256)
plt.show()

cv2.waitKey()
cv2.destroyAllWindows()
  • 原图
    python+opencv绘制直方图_第1张图片
  • 直方图
    python+opencv绘制直方图_第2张图片

使用calcHist生成灰度图像直方图

import cv2

img = cv2.imread("/home/forrest/图片/lena彩图.png", cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([img], [0], None, [256], [0, 255])
print(type(hist))
print(hist.size)
print(hist.shape)

plt.plot(hist, color="r")
plt.show()
  • 原始图像
    python+opencv绘制直方图_第3张图片
  • 输出结果

256
(256, 1)
  • 输出直方图
    python+opencv绘制直方图_第4张图片

使用calcHist生成彩色图像直方图

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("/home/forrest/图片/lena彩图.png")
histb = cv2.calcHist([img], [0], None, [256], [0, 255])
histg = cv2.calcHist([img], [1], None, [256], [0, 255])
histr = cv2.calcHist([img], [2], None, [256], [0, 255])

plt.plot(histb, color="b")
plt.plot(histg, color="g")
plt.plot(histr, color="r")
plt.show()
  • 原始图像
    python+opencv绘制直方图_第5张图片
  • 生成直方图
    python+opencv绘制直方图_第6张图片

绘制掩码直方图

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread("/home/forrest/图片/lena彩图.png", cv2.IMREAD_GRAYSCALE)

mask = np.zeros(image.shape, np.uint8)
mask[200:400, 200:400] = 255

histMI = cv2.calcHist([image], [0], mask, [256], [0, 255])
histImage = cv2.calcHist([image], [0], None, [256], [0, 255])

plt.plot(histImage)
plt.plot(histMI)
plt.show()
  • 原始图像
    python+opencv绘制直方图_第7张图片
  • 绘制掩码直方图和整图直方图对比
    python+opencv绘制直方图_第8张图片

生成掩膜图像

import cv2
import numpy as np

image = cv2.imread("/home/forrest/图片/lena彩图.png", 0)

mask = np.zeros(image.shape, np.uint8)
mask[200:400, 200:400] = 255

mi = cv2.bitwise_and(image, mask)
cv2.imshow("original", image)
cv2.imshow("mask", mask)
cv2.imshow("mi", mi)

cv2.waitKey()
cv2.destroyAllWindows()
  • 原始图像
    python+opencv绘制直方图_第9张图片
  • 掩码图像
    python+opencv绘制直方图_第10张图片
  • 生成的掩膜图像
    python+opencv绘制直方图_第11张图片

图像直方图均衡化

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("/home/forrest/图片/lena彩图.png", cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)

plt.subplot(221)
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()
  • 结果
    python+opencv绘制直方图_第12张图片

pyplot显示彩色图像

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("/home/forrest/图片/lena彩图.png")
b,g,r = cv2.split(img)
img2 = cv2.merge([r, g, b])

plt.subplot(121)
plt.imshow(img)
plt.axis('off')

plt.subplot(122)
plt.imshow(img2)
plt.axis('off')

plt.show()
  • 结果
    python+opencv绘制直方图_第13张图片

你可能感兴趣的:(Python,OpenCV)