栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

图像直方图

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

图像直方图

文章目录
  • 1 图像直方图基本概念
  • 2 使用opencv统计图片的直方图
  • 3 绘制直方图
    • 原始图片
    • 色彩分布情况
  • 4 使用掩膜的直方图
  • 5 直方图均衡化
    • 均衡化具体步骤

1 图像直方图基本概念

  在统计学上直方图是对数据分布的统计,是一种二维的统计图表。

  • 图像直方图用来表示数字像素中亮度分布的情况,通过使用图像直方图,标注坐标轴中像素的亮度。

  • 横坐标:图像中像素的灰度级。0-255

  • 纵坐标:具有该灰度级像素的个数。

    图片来源:https://www.cambridgeincolour.com/tutorials/histograms1.htm

  • 得到一个灰度级矩阵,计算出x轴,y轴即可画出直方图
    ( 1 2 2 3 ) X = [ 1 , 2 , 3 ] Y = [ 1 , 2 , 1 ] begin{pmatrix} 1 & 2 \ 2 & 3 end{pmatrix} X = [1,2,3] Y = [1,2,1] (12​23​)X=[1,2,3]Y=[1,2,1]

  • dims:统计的特征数目个数,一般为1,只统计灰度值

  • bins:每个特征空间子区段的数目

  • range:统计灰度值范围,一那么是【0,255】

2 使用opencv统计图片的直方图
  • cv2.calcHist(img,channels,mask,histSize,ranges)
  • img:原始图片
  • channels:指定通道。需要用中括号括起来。如果是灰色图灰度值为[0],色彩图[0][1][2]对应B、G、R
  • mask:掩码图像。统计整个图的直方图为None,局部需要设计
  • histSize:Bins区间的个数,需要用中括号[256]等表示
  • ranges:像素的范围[0,255]
import cv2

# 读取图片
img = cv2.imread('imgs/66.jpg')

# 对此图片进行直方图的灰度值统计,可以统计多个照片,使用灰度值,全图检测,划分256个区间,范围在0到255
hist = cv2.calcHist([img], [0], None, [256], [0, 255])

3 绘制直方图

 使用calHist统计出不同颜色的灰度统计,结合matplotlib库函数绘制出直方图

原始图片


图片来源:https://www.douyu.com/

色彩分布情况

import cv2
from matplotlib import pyplot as plt


# 读取图片
img = cv2.imread('imgs/66.jpg')


# 对此图片进行直方图的灰度值统计,可以统计多个照片,使用灰度值,全图检测,划分256个区间,范围在0到255
hist1 = cv2.calcHist([img], [0], None, [256], [0, 255])
hist2 = cv2.calcHist([img], [1], None, [256], [0, 255])
hist3 = cv2.calcHist([img], [2], None, [256], [0, 255])


#分别统计三种色彩的分布情况
plt.plot(hist1,'b')
plt.plot(hist2,'g')
plt.plot(hist3,'r')
plt.show()
4 使用掩膜的直方图


  为了得到某个局部位置的像素直方图情况,使用掩膜创建一个跟原图片大小一样的纯黑图片。

  • 将想要测量的目标区域设为255.:mask = [100:200,200:300] = 255
import cv2
import numpy as np
from matplotlib import pyplot as plt



#读取要识别的照片
img = cv2.imread('imgs/66.jpg')

#将照片转换成单通道的灰色图
gary =  cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#设置掩膜
mask = np.zeros(np.shape(gary),np.uint8)

#设置需要获取的部分
mask[100:200,100:200] = 255

#局部照片的像素灰度情况
hist1 = cv2.calcHist([gary],[0],mask,[256],[0,255])
#整张照片的灰度情况
hist2 = cv2.calcHist([gary],[0],None,[256],[0,255])

#绘制图片
plt.plot(hist1,label='mask')
plt.plot(hist2,label='img')

plt.show()

5 直方图均衡化

  • 当直方图的灰度值出现过于集中的时候,为了使照片显得颜色均匀,故引入直方图均衡化
均衡化具体步骤
  1. 计算出图片的直方图,统计像素集的个数,计算概率,得到累计概率的直方图
  2. 将直方图进行区间转换:将概率*灰度集的个数
  3. 在概率直方图中,将概率相近的当做同一个灰度级
  • cv2.equalizeHist(src,[dst]):原图+目标图
import cv2
from matplotlib import pyplot as plt

#读取要识别的照片
img = cv2.imread('imgs/66.jpg')

#将照片转换成单通道的灰色图
old_img =  cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

new_img = cv2.equalizeHist(old_img)

#原先照片的像素灰度情况
hist1 = cv2.calcHist([old_img],[0],None,[256],[0,255])
#均衡化之后照片的灰度情况
hist2 = cv2.calcHist([new_img],[0],None,[256],[0,255])

#绘制图片
plt.plot(hist1,label='old')
plt.plot(hist2,label='new')
plt.legend()
plt.show()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004641.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号