天天看点

opencv-python 学习笔记(7) ------直方图

opencv-python 学习笔记(7)

------直方图

7.1 灰度直方图

7.1.1 原理

直方图是对数据进行统计的一种方法,并将统计值组织到一系列定义好的直条中。图像直方图(Image Histogram)是用来表示图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。在这种直方图中,通常沿横坐标从左到右亮度逐渐增大,如下图。

opencv-python 学习笔记(7) ------直方图

(注:直方图是根据灰度图来生成的。)

直方图的一些术语和细节:

dims:需要统计的特征数目。例如,某直方图只统计了灰度值,dims=1;

bins:每个特征空间子区段的数目,即直方图的直条数目;

range:要统计特征的取值范围,例如,灰度值的range=[0,255].

7.1.2 直方图的计算与绘制

使用cv2统计,使用matplotlib绘制。

代码:

参数:

images:图像,当传入函数时应该用[]括起来,如:[img];

channels:若图像为灰度图,则为[0],若为彩图,可为[0],[1],[2],分别对应B,G,R。

mask:是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像;

histSize:BIN的数目,也需用中括号括起来,如:[111];

ranges:像素值的范围,一般为[0,255].

例子:

import  cv2
from  matplotlib  import  pyplot as plt

img=cv2.imread('1.jpg')
ni=cv2.calcHist(images=[img],channels=[0],mask=None,histSize=[256],ranges=[0,256])
plt.figure(figsize=(10,6),dpi=100)
plt.plot(ni)
plt.grid()
plt.show()
           

结果:

opencv-python 学习笔记(7) ------直方图

7.1.3 掩模的应用

定义:

掩膜是用选定的图像或物体,对要处理的图形进行遮挡,来控制图像处理的区域。在cv2中,我们使用二维矩阵数组进行掩膜,1的区域被处理,0的被屏蔽,不会处理。

用途:

提取感兴趣的区域;

屏蔽某些不需要处理的区域;

结构特征提取:用相似行变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征;

特殊形状图像制作。

例子:

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

# 创建mask
img = cv2.imread('2.jpg', 0)
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)#与操作
hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask, 'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()
           

结果:

opencv-python 学习笔记(7) ------直方图

7.2 直方图均衡化

定义

:就是把原始图像的灰度直方图从某个比较集中的灰度区间变成更广泛灰度范围内的分布。即对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同,如下图。

opencv-python 学习笔记(7) ------直方图

优点:提高图像整体的对比度,还可以在曝光过度或不足的图像中更好的突出细节。

代码:cv2.equalizeHist(src)

参数:src:图像

7.3 自适应的直方图均衡化

定义:

普通的直方图均衡化,我们考虑的是图像的全局对比度,这样容易丢失许多信息。

为了解决这个问题,我们需要使用自适应的直方图均衡化。此时,整幅图像会被分成很多小块,这些小块被称为"tiles"(在 OpenCV中tiles的大小默认是8x8),然后再对每一个小块分别进行直方图均衡化)。如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。

最后为了去除每一个小块之间的边界,再使用双线性差值,对每一小块进行拼接。

代码:

参数:

clipLimit:对比度限制,默认是40;

tileGirdSize:分块的大小,默认是8X8.

继续阅读