python-直方图
-
- 一、直方图的定义及绘制
- 二、直方图均衡化
- 三、直方图反向投影
一、直方图的定义及绘制
"""
直方图:是一种对数据分布情况的图像表示
意义:
1.直方图是图像中像素强度分布的图形表达式
2.直方图统计了每一个强度值所具有的像素个数
特征:
1.直方图不在表示任何图像纹理信息,而是对图像像素的统计
2.对于同一物体无论是旋转还是平移在图像中都具有相同的灰度值,因此直方图具有平移不变性、放缩不变性
cv2.calcHist(images,channels,mask,histSize,ranges[hist[accumulate]])
images:整型类型(uint8和float32)的原图(list形式显示)
channel:通道的索引,例如,[0]代表灰度图片,[0],[1],[2]代表多通道
mask:计算图片指定区域的直方图,如果mask为None,那么计算整张图
histSize:每个色调值(范围0-255)对应的(像数值/频率)。这256个值中的每一个都成为bin,它的取值有8,16,32,64,128,256.
在opencv中,用histSize表示bins
range:强度值的范围,[0,255]
"""
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('img_2.png',1)
plt.hist(img.ravel(),256,[0,256])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import matplotlib.pyplot as plt
color = ('blue','red','white')
for i,color in enumerate(color):
hist = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(hist,color=color)
plt.xlim([0,256])
plt.show()
二、直方图均衡化
代码中的img_2.png
代码中的img_3.png
"""
直方图均衡化:通过拉伸像素强度的分布范围,使得图像灰度分布尽量均匀,提高了图像的对比度,达到改善图像的主观视觉目的,
对比度较低的图像适合使用直方图均衡化方法来增强图像细节
方法格式:cv2.equallizeHist(img)
"""
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('img_2.png',0)
dst = cv2.equalizeHist(img)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.subplot(121)
plt.hist(img.ravel(),256,[0,256])
plt.subplot(122)
plt.hist(dst.ravel(),256,[0,256])
plt.show()
import cv2
img = cv2.imread('img_2.png')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([hsv],[0,1],None,[160,256],[0,160,0,256])
cv2.imshow('img',img)
cv2.imshow('hist',hist)
cv2.waitKey(0)
cv2.destroyAllWindow
三、直方图反向投影
"""
直方图反向投影:用于图像分割或在图像中查找感兴趣的对象,它的输出结果和输入图像的大小相同(但只有一个通道),
每个像素对应于该像素属于我们感兴趣对象的概率,也就是说,与其余部分相比,输出图像在可能有对象的区域具有更多的白色部分
方法格式:cv2.calcBackProject(img,channels,hisd,ranges,scale[.dst])
img:输入图片
channel:通道
hsit:输入直方图
ranges:直方图的每一维的取值范围
scale:可选输出反向投影的比例因子,一般是1
"""
import cv2
sample = cv2.imread('img_2.png')
img = cv2.imread('img_1.png')
sample_hsv = cv2.cvtColor(sample,cv2.COLOR_BGR2HSV)
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
sample_hist = cv2.calcHist([sample_hsv],[0,1],None,[20,60],[0,160,0,256])
cv2.normalize(sample_hist,sample_hist,0,255,cv2.NORM_MINMAX)
dst = cv2.calcBackProject([img_hsv],[0,1],sample_hist,[0,160,0,256],1)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()