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:
![在这里插入图片描述](https://img-blog.csdnimg.cn/30e7563bb2544d098358ab711c41f9f8.png)
直方图统计
![在这里插入图片描述](https://img-blog.csdnimg.cn/cba622e40ac74f1a95283b014b6b6b70.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
img = cv_read("./img.png")
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1cbc6a73f6534e2eb06347664d92794b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_12,color_FFFFFF,t_70,g_se,x_16)
plt.hist(img.ravel(),256)
plt.show()
![在这里插入图片描述](https://img-blog.csdnimg.cn/f69cc5605cc34fefaa50dbc395cd767c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_12,color_FFFFFF,t_70,g_se,x_16)
可以通过掩码扣出一部分区域进行直方图统计
mask = np.zeros(img.shape,np.uint8)
mask[80:120,80:150] = 255
cv_show(mask)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9f7343c88e8141579b3c3498b7a9af38.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_10,color_FFFFFF,t_70,g_se,x_16)
mask_img = np.bitwise_and(img,mask)
cv_show(mask_img)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9354351e4ce44709bd0cc175b3ad0bd5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_10,color_FFFFFF,t_70,g_se,x_16)
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)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9e01f85b291c4f6094e50e6bd0522024.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_12,color_FFFFFF,t_70,g_se,x_16)
fig,(a,b) = plt.subplots(1,2)
a.hist(img.ravel(),256)
b.hist(mask_img[80:120,80:150].ravel(),256)
plt.show()
![在这里插入图片描述](https://img-blog.csdnimg.cn/c11eaf2f43f14890b195e0686cacdd9b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_12,color_FFFFFF,t_70,g_se,x_16)
直方图均衡
- 对于一些没有小细节的图,均衡化之后会显得图更亮,更突出了
- 对于一些有很多小细节的图,均衡化之后会丢失那些原本细节的部分
均衡前
plt.hist(img.ravel(),256)
plt.show()
![在这里插入图片描述](https://img-blog.csdnimg.cn/7f7c2c8472b14d21aed423a10999001a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_12,color_FFFFFF,t_70,g_se,x_16)
均衡后
equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()
![在这里插入图片描述](https://img-blog.csdnimg.cn/c8e42b6beac04ceb9624e0e1bfffb737.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_12,color_FFFFFF,t_70,g_se,x_16)
show = np.hstack((img,equ))
cv_show(show)
![在这里插入图片描述](https://img-blog.csdnimg.cn/15c29670c9334471bc116a6f3070a2b6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
局部均衡化(分小块均衡):自适应直方图均衡
adaptive = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
result_adaptive = adaptive.apply(img)
show = np.hstack((img,equ,result_adaptive))
cv_show(show)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1289371507624318b6841dceda923537.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pqW5LuU5Lya6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)