直方图:
函数cv2.calcHist(images,channels,mask,histSize,ranges)
images:原图像图像格式为uint8或float32.当传入函数时应用[]来括起来[img]
channels:同样用中括号来括它会告函数我们统幅图像的直方图对应的是BGR
mask:掩模图像。统整幅图像的直方图就把它为None
ranges:像素值范围为[0:256]
绘制直方图(灰色图):
import cv2
import numpy as np
from matplotlib import pyplot as plt
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread (r'D:photodatahome.jpg')
histr = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.hist(img.ravel(),256)
plt.show()
效果展示:
绘制多颜色通道:
import cv2
import numpy as np
from matplotlib import pyplot as plt
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#绘制多通道:
img = cv2.imread (r'D:photodatahome.jpg')
color = ('b', 'g', 'r')
#用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
#同时列出数据和数据下标,一般用在 for 循环当中
for i, col in enumerate(color):
histr = cv2.calcHist([img], [i], None, [256], [0, 256])
#plt模块下的一个函数,用于画图它可以绘制点和线,并且对其样式进行控制.
plt.plot(histr)
#设置x轴的数值显示范围
plt.xlim([0, 256])
plt.show()
效果展示:
原图和掩码的直方图:
import cv2
import numpy as np
from matplotlib import pyplot as plt
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#mask 掩码
img =cv2.imread(r'D:photodatahome.jpg',0)
#掩码的图像
mask = np.zeros(img.shape[:2],np.uint8) #np.uint8无符号整形
mask[100:300,100:400] = 255 #保存什么值把什么变成255
masked = cv2.bitwise_and (img,img,mask=mask)#与操作,mask=mask表示要提取的区域
res = np.hstack((img,mask,masked))
cv_show('res',res)
效果图:原图、掩码图、最终图
原图和掩码图的直方图:
import cv2
import numpy as np
from matplotlib import pyplot as plt
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img =cv2.imread(r'D:photodatahome.jpg',0)
#掩码的图像
mask = np.zeros(img.shape[:2],np.uint8) #np.uint8无符号整形
mask[100:300,100:400] = 255 #保存什么值把什么变成255
#masked = cv2.bitwise_and (img,img,mask=mask)#与操作,mask=mask表示要提取的区域
hist_full = cv2.calcHist([img],[0],None,[256],[0, 256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0, 256])
plt.subplot(221),plt.plot(hist_full),plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()
效果:
直方图的均衡化(容易丢失细节):
import cv2
import numpy as np
from matplotlib import pyplot as plt
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread(r'D:photodatalena.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('asa',res)
效果:
自适应直方图均衡化(分块处理):
import cv2
import numpy as np
from matplotlib import pyplot as plt
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread(r'D:photodatalena.jpg',0)
#自适应直方图均衡化(分块处理)
#第一个数据颜色对比度的阈值,第二个数据进行像素均衡化的网格大小
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
res_clahe = clahe.apply(img)
res = np.hstack((img,res_clahe))
cv_show('res',res)
效果:
大家可以对比直方图的均衡化和自适应直方图均衡化两个结果来看一看优缺点,根据自己的需求来选择不同的处理方法



