python-直方图

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])  # ravel()统计出现的频次
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

python-直方图_第1张图片

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()

python-直方图_第2张图片

二、直方图均衡化

python-直方图_第3张图片

代码中的img_2.png

python-直方图_第4张图片
代码中的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)
# img.ravel()将图像转换为一维数组
plt.hist(img.ravel(),256,[0,256])
plt.subplot(122)
plt.hist(dst.ravel(),256,[0,256])
plt.show()

python-直方图_第5张图片

# 二维直方图,一维直方图只考虑某一个通道的强度值,二维直方图考虑两个通道,例如色彩-饱和度直方图
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

python-直方图_第6张图片

三、直方图反向投影

"""
直方图反向投影:用于图像分割或在图像中查找感兴趣的对象,它的输出结果和输入图像的大小相同(但只有一个通道),
             每个像素对应于该像素属于我们感兴趣对象的概率,也就是说,与其余部分相比,输出图像在可能有对象的区域具有更多的白色部分
方法格式:cv2.calcBackProject(img,channels,hisd,ranges,scale[.dst])
           img:输入图片
           channel:通道
           hsit:输入直方图
           ranges:直方图的每一维的取值范围
           scale:可选输出反向投影的比例因子,一般是1
"""
import cv2
# 创建感兴趣对象 sample
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()


python-直方图_第7张图片

你可能感兴趣的:(python,cv,opencv,计算机视觉)