文章目录
- 直方图统计
-
- 可以通过掩码扣出一部分区域进行直方图统计
- 直方图均衡
-
- 局部均衡化(分小块均衡):自适应直方图均衡
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as c
def cv_show(img):
cv2.imshow("img",img)
cv2.waitKey(0)
def cv_read(img_file,gray=True):
if gray == True:
return cv2.imread(img_file,0)
else:
return cv2.imread(img_file)
- 下文中使用的图像为 lena:
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第1张图片](http://img.e-com-net.com/image/info8/24dc823773b9494595261740e4de8d1d.jpg)
直方图统计
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第2张图片](http://img.e-com-net.com/image/info8/d52ab08c48524b18b66901b47d90d623.jpg)
img = cv_read("./img.png")
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist)
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第3张图片](http://img.e-com-net.com/image/info8/e29274dfc43c4251944ca5faf4220f4f.jpg)
plt.hist(img.ravel(),256)
plt.show()
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第4张图片](http://img.e-com-net.com/image/info8/fc8622f89cd745aa9332539da0865610.png)
可以通过掩码扣出一部分区域进行直方图统计
mask = np.zeros(img.shape,np.uint8)
mask[80:120,80:150] = 255
cv_show(mask)
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第5张图片](http://img.e-com-net.com/image/info8/35b65774f5784c07b245bc491dd48f15.jpg)
mask_img = np.bitwise_and(img,mask)
cv_show(mask_img)
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第6张图片](http://img.e-com-net.com/image/info8/0e2a4810d21f47d88f9ba7301e3ddb92.jpg)
hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])
fig,(a,b) = plt.subplots(1,2)
a.plot(hist_full)
b.plot(hist_mask)
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第7张图片](http://img.e-com-net.com/image/info8/60df6d6999c14e349d133342d5eaed8b.jpg)
fig,(a,b) = plt.subplots(1,2)
a.hist(img.ravel(),256)
b.hist(mask_img[80:120,80:150].ravel(),256)
plt.show()
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第8张图片](http://img.e-com-net.com/image/info8/17fc9166aa5d47bf9f55de73eb546edc.png)
直方图均衡
- 对于一些没有小细节的图,均衡化之后会显得图更亮,更突出了
- 对于一些有很多小细节的图,均衡化之后会丢失那些原本细节的部分
均衡前
plt.hist(img.ravel(),256)
plt.show()
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第9张图片](http://img.e-com-net.com/image/info8/b0a7ad3b6c3043f7a633f7df21295a99.png)
均衡后
equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第10张图片](http://img.e-com-net.com/image/info8/c9af03d3702f42a4abf0a25a621acd26.png)
show = np.hstack((img,equ))
cv_show(show)
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第11张图片](http://img.e-com-net.com/image/info8/0010ee59dec04aa8adce08aef00c3d41.jpg)
局部均衡化(分小块均衡):自适应直方图均衡
adaptive = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
result_adaptive = adaptive.apply(img)
show = np.hstack((img,equ,result_adaptive))
cv_show(show)
![opencv学习之:直方图统计、均衡、局部直方图均衡(自适应均衡)_第12张图片](http://img.e-com-net.com/image/info8/e029473b0bd44dd4b7de4ed0018661b4.jpg)