展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

图像直方图

  • 简介
图像直方图是把图像变为灰度图,分成一个一个像素点的值进行统计,如下图左所示。
直方图统计函数 cv2.calcHist(images,channels,mask,histSize,ranges)
images:原图像的图像格式为 uint8 或 float32。当传入函数时应该用中括号 [] 括来传入,例如[img]
channels:同样用中括号来传入,它会告诉函数统幅的哪幅灰度图的直方图。如果传入的图像是灰度图它的值就是 [0],如果是彩色图像,那么传入的参数可以是 [0][1][2],它们分别对应着 B、G、R 通道,每个通道的图像都是灰度图。
mask:掩模图像。统计整幅图像的直方图时就把它设为 None。但是如果你想统计图像的某一部分区域的直方图的,你就制作一个掩模图像并使用它。
histSize:BIN 的数目。也应用中括号括来。
ranges: 统计的像素值范围,常为 [0-256]。

  • 直方图统计
import cv2
import numpy as np
import matplotlib.pyplot as plt # Matplotlib 是 RGB
%matplotlib inline
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
img = cv2.imread('01_Picture/01_Cat.jpg',0) # 0 表示灰度图
print((img.ravel()).shape)
plt.hist(img.ravel(),256) # img.ravel()将 img 拉成一维数组
plt.show()
# 执行结果:(207000,)

img = cv2.imread('01_Picture/01_Cat.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
print(histr.shape)
plt.plot(histr,color=col)
plt.xlim([0,256])
# 执行结果
(256, 1)
(256, 1)
(256, 1)

  • 图像掩码区域
img = cv2.imread('01_Picture/01_Cat.jpg',0)
cv_show(img,'img')
print(img.shape[:2])
mask = np.zeros(img.shape[:2],np.uint8)
print(mask.shape)
mask[100:300,100:400] = 255
cv_show(mask,'mask')
masked_img = cv2.bitwise_and(img,img,mask=mask) # 与操作
cv_show(masked_img,'masked_img')
# 执行结果
(414, 500)
(414, 500)
  • 执行结果
点击查看详情

  • 图像掩码直方图
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()

  • 直方图均衡化
直方图均衡化:一般可以用来提升图片的亮度。
直方图均衡前是一个瘦高的统计图,直方图均衡后是一个矮胖的统计图。
点击查看详情

  • 代码案例
img = cv2.imread('01_Picture/16_Clahe.jpg',0)
plt.hist(img.ravel(),256)
plt.show()
equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()
res = np.hstack((img,equ))
cv_show(res,'res')

  • 自适应直方图均衡化
如上图所示,直方图均衡化,人脸石膏本来有一些特征,可能由于直方图均衡导致丢失一些细节。所以可能切分成几个小块,局部做直方图均衡化,会比较好。
切分成几个小块之后,可能会导致一个现象,每个格子都会产生一个边界,opencv是对每个格子的边界进行线性插值处理。
直方图均衡化函数:cv2.createCLAHE(clipLimit,tileGridSize)
clipLimit 颜色对比度的阈值。
titleGridSize 进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
  • 代码案例
img = cv2.imread('01_Picture/16_Clahe.jpg',0)
clahe = cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8)) # 自适应均衡化方法生成出来
res_clahe = clahe.apply(img) # 方法应用到输入图片当中
res = np.hstack((img,equ,res_clahe))
cv_show(res,'res')

posted @   DogLeftover  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示