累计直方图代表图像组成成分在灰度级的累计概率分布情况,每一个概率值代表小于等于此灰度值的概率,公式:
当图像中的特征不能取遍所有可能值时,颜色直方图中会出现很多零值。这些零值会影响直方图相交运算,从而使匹配值不能正确地反映两幅图像之间的颜色差别。由颜色直方图演化而来的累积直方图可以解决上述问题。
import cv2
import numpy as np
import matplotlib.pyplot as plt
def DCF(n):
length = len(n)
ll = []
for i in range(length):
if i ==0:
ll.append(n[i])
elif i == length-1:
tmp = ll[- 1] + n[i]
ll.append(tmp)
return ll
else:
tmp = ll[- 1] + n[i]
ll.append(tmp)
def main():
path = "/home/cheng/Documents/practice_py/cv/20180207120954818.png"
img = cv2.imread(path,1)
hist = np.bincount(img.ravel(),minlength=256).tolist()
ll = DCF(hist)
ll = np.round(np.float32(ll)/(img.shape[0]*img.shape[1]),4)
plt.figure(num="DCF",facecolor="lightgray")
plt.title("DCF")
plt.xlabel("index",fontsize=14)
plt.ylabel("value", fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
# 绘制曲线
plt.plot(range(0,256), ll, c='dodgerblue',
label=r'$P(rk)=n1+n2+n3+...Nk $')
plt.legend()
plt.show()
main()