一、图像直方图:

  1. 直方图是对图像像素的统计分布,它统计了每个像素(0到L-1)的数量。

  2. 直方图均衡化就是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。

  3. 直方图均衡化的中心思想是把原始图像的的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布。


cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) #返回hist
  • images代表输入的图像,可以不用方括号括起来
  • channels代表通道数,若为灰度图像,就使用第一个即可;
  • mask代表掩码,使用就输入对应的mask,没使用的话就设为None
  • histSize,代表bin的数目,使用中括号;
  • ranges,为像素值的取值范围,使用中括号;一般为[0,256];
  • accumulate是一个布尔值,用来表示直方图是否叠加。

人们把照片的亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域,255表示最亮的纯白色,而中间的数字就是不同亮度的灰色。

下面看一个示例:原始图像如下:我们来求其直方图!

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

def cv_show(name,img):
    cv2.imshow(img,name)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('../image/cat.jpg',0)
# cv_show(img,'img')

"""
    calcHist()参数:
    1、图像
    2、通道
    3、mask
    4、histSize,bin的数目,使用中括号
    5、像素值的取值范围;使用中括号
"""
img1 = cv2.calcHist(img,[0],None,[256],[0,256])
print(img1.shape)
plt.hist(img.ravel(),256);
plt.imsave('../image/cat_hist.png',img1)
plt.show()

刚刚是针对灰度图像;下面我们输出三个通道的颜色分布;分别对应(B,G,R)

#输出三个通道的颜色分布
img = cv2.imread('../image/cat.jpg')
color = ('b','g','r')

#枚举,i对应的是index,而col对应的是相应的Index对应的颜色
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color=col)
    plt.xlim([0,256])
    plt.show() #不添加这个不显示图片

二、mask掩码操作:

掩码可以简单理解为;保留图像的某个部分!而掩盖掉不想要的部分;这个掩码可以自己设置;下面我们创建一个和对应图像尺寸相同的mask;如下图所示;

1、创建掩码

#创建掩码
mask = np.zeros(img.shape[:2],np.uint8)
print(mask.shape)
mask[90:300,90:400] = 255
# cv_show(mask,'mask')

2、进行图像掩码操作

img = cv2.imread('../image/cat.jpg',0)
mask_img = cv2.bitwise_and(img,img,mask=mask) #取与
# cv_show(mask_img,'mask_img')

#完整的图像直方图信息
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(mask_img,'gray')
plt.subplot(224),plt.plot(hist_full),plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()

三、图像均衡化

直方图均衡化就是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。直方图均衡化的中心思想是把原始图像的的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布。旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。

左边为原图,右边为均衡化的图像;明显右边图像更明显些,但是部分细节却因此消失了!

"""
    图像均衡化
    图像均衡化后,像素点更加明显了,图片看起来也更加清晰
    但是会丢失一些细节
"""
img2 = cv2.imread('../image/clahe.jpg',0)
#cv_show(img2,'img2')
plt.hist(img2.ravel(),256)
# plt.show()

equ = cv2.equalizeHist(img2)
plt.hist(equ.ravel(),256)
# plt.show()

res = np.hstack((img2,equ))
cv_show(res,'res')

四、自适应均衡化

自适应均衡化,比均衡化相比而言,保留了图像的细节,同时图像的清晰度也显著提高了!

"""
    自适应直方图均衡化

"""
clahe = cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
res_clahe = clahe.apply(img2)
res = np.hstack((img2,equ,res_clahe))
cv_show(res,'res')

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐