| 图像直方图是把图像变为灰度图,分成一个一个像素点的值进行统计,如下图左所示。 |
| |
| 直方图统计函数 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 inline |
| |
| def cv_show(img,name): |
| cv2.imshow(name,img) |
| cv2.waitKey() |
| cv2.destroyAllWindows() |
| |
| img = cv2.imread('01_Picture/01_Cat.jpg',0) |
| print((img.ravel()).shape) |
| plt.hist(img.ravel(),256) |
| plt.show() |
| |

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

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App