您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python+OpenCV图像处理之直方图统计的示例分析
## 摘要
本文详细讲解使用Python+OpenCV进行图像直方图统计的原理与实践,涵盖灰度/彩色直方图计算、可视化分析、均衡化处理等核心内容,并提供完整代码示例和效果对比。
## 一、直方图基础理论
### 1.1 直方图的数学定义
直方图是图像像素强度分布的统计图形表示,数学表达式为:
H(k) = n_k, k ∈ [0,L-1]
其中:
- L为灰度级数(通常256)
- n_k为图像中灰度值为k的像素个数
### 1.2 直方图的图像分析意义
1. **亮度分析**:直方图峰值左偏表示图像偏暗,右偏表示过亮
2. **对比度评估**:分布范围窄则对比度低
3. **特征提取**:可用于目标检测的前期处理
4. **质量诊断**:识别过曝/欠曝问题
## 二、OpenCV直方图计算
### 2.1 基础API说明
```python
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
参数详解:
- images
:输入图像列表(需用[]包裹)
- channels
:要统计的通道索引
- mask
:可选掩膜(None表示全图)
- histSize
:直方图bin数量
- ranges
:像素值范围(通常[0,256])
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('lena.jpg', 0) # 灰度模式读取
hist = cv2.calcHist([img], [0], None, [256], [0,256])
plt.figure(figsize=(10,4))
plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.plot(hist)
plt.xlim([0,256])
plt.show()
img = cv2.imread('test.jpg')
colors = ('b','g','r')
plt.figure(figsize=(12,5))
for i,color in enumerate(colors):
hist = cv2.calcHist([img], [i], None, [256], [0,256])
plt.plot(hist, color=color)
plt.title('RGB Channel Histogram')
通过变换函数:
s_k = T(r_k) = (L-1) * Σ(p_r(r_j)), j=0→k
将原始直方图分布改为均匀分布,增强对比度。
# 灰度图均衡化
equ = cv2.equalizeHist(img)
res = np.hstack((img, equ)) # 并排对比
# 彩色图均衡化(需分通道处理)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hsv[:,:,2] = cv2.equalizeHist(hsv[:,:,2])
equ_color = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
通过模板直方图在目标图像中寻找相似区域,常用于: - 目标跟踪 - 图像分割 - 颜色识别
roi = cv2.imread('roi.jpg')
target = cv2.imread('target.jpg')
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
hsv_tar = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
roi_hist = cv2.calcHist([hsv_roi], [0,1], None, [180,256], [0,180,0,256])
dst = cv2.calcBackProject([hsv_tar], [0,1], roi_hist, [0,180,0,256], 1)
# 结果二值化显示
ret, thresh = cv2.threshold(dst, 50, 255, 0)
def adjust_exposure(img, gamma=1.0):
invGamma = 1.0 / gamma
table = np.array([((i / 255.0) ** invGamma) * 255
for i in np.arange(0, 256)]).astype("uint8")
return cv2.LUT(img, table)
corrected = adjust_exposure(img, gamma=0.4)
def hist_compare(img1, img2):
hist1 = cv2.calcHist([img1], [0], None, [256], [0,256])
hist2 = cv2.calcHist([img2], [0], None, [256], [0,256])
return cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
similarity = hist_compare(img1, img2)
print(f"Similarity: {similarity:.2f}")
small = cv2.resize(img, (0,0), fx=0.5, fy=0.5)
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 200:400] = 255
hist = cv2.calcHist([img], [0], mask, [256], [0,256])
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 计算并绘制直方图
hist = cv2.calcHist([gray], [0], None, [256], [0,256])
plt.clf()
plt.plot(hist)
plt.pause(0.01)
cv2.imshow('Frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
”`
注:本文实际约3700字(含代码),可根据需要调整理论部分篇幅或增加更多应用案例。建议配合Jupyter Notebook实际操作示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。