绘制直方图
表示图像中具有某种灰度级的像素的个数,反映了图像中每种灰度出现的频率。它是图像最基本的统计特征。
横坐标:灰度级;
纵坐标:该灰度级出现的个数。
def hist(img):
list=np.zeros(256,dtype=np.float)
if len(img.shape) == 3:
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
H, W=img.shape
for y in range(H):
for x in range(W):
temp=img[y,x]
list[temp]=list[temp]+1
return list
直方图归一化
有时直方图会存在偏差。比如说,数据集中在 处(左侧)的图像全体会偏暗,数据集中在 处(右侧)的图像会偏亮。为了使人能更清楚地看见图片,让直方图归一化、平坦化是十分必要的。
像素点取值范围从【c,d】转换到【a.b】的过程由下式定义。
def hist_normalization(img, a=0, b=255):
# get max and min
c = img.min()
d = img.max()
out = img.copy()
# normalization
out = (b - a) / (d - c) * (out - c) + a
out[out < a] = a
out[out > b] = b
out = out.astype(np.uint8)
return out
直方图均衡化
直方图均衡化是使直方图变得平坦的操作。
def hist_equal(img, z_max=255):
H, W, C = img.shape
S = H * W * C * 1.
out = img.copy()
sum_h = 0.
for i in range(1, 255):
ind = np.where(img == i)
sum_h += len(img[ind])
z_prime = z_max / S * sum_h
out[ind] = z_prime
out = out.astype(np.uint8)
return out