准备工作:
如果没有安装 matplotlib 的,在cmd里安装一下:
命令:cd\ 回车
命令:pip install matplotlib
import cv2 as cv
import numpy as np
#导包
from matplotlib import pyplot as plt
#准备图片
src=cv.imread("C:/Users/admin/Pictures/zyl/Tes1.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
图像直方图
直方图主要反映图像的主要特征和次要特征
def image_hist(image):
color=('blue','green','red')
#enumerate用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
for i,color in enumerate(color):
#calcHist函数是用来计算图像直方图的
#cv.calcHist([输入图像],[需要统计直方图的第几通道],None,[256],[0,256])
hist=cv.calcHist([image],[i],None,[256],[0,256])
plt.plot(hist,color=color)
#xlim设置x轴的数值显示范围
#xlim([0,256])
plt.xlim([x轴上的最小值,x轴上的最大值])
plt.show()
直方图的应用
直方图均衡化
#对比度增强(全图受影响)
def equalHist_demo(image):
#必须转成gray格式
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#equalizeHist对上面灰度图做直方图均衡化
dst = cv.equalizeHist(gray)
cv.imshow("equal-demo",dst)
#对比度增强(局部受影响)
def clahe_demo(image):
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#实例化自适应直方图均衡化函数
clahe = cv.createCLAHE(clipLimit=5.0,tileGridSize=(8,8))
#进行自适应直方图均衡化
dst= clahe.apply(gray)
cv.imshow("clahe_demo",dst)
直方图比较
#rgbHist用于提取RGB图像中的颜色直方图,方法简单,易懂
def create_rgb_hist(image):
h,w,c=image.shape
rgbHist=np.zeros([16*16*16,1],np.float32)
bsiz=256/16
for row in range(h):
for col in range(w):
b=image[row,col,0]
g=image[row,col,1]
r=image[row,col,2]
index=np.int(b/bsiz)*16*16+np.int(g/bsiz)*16+np.int(r/bsiz)
rgbHist[np.int(index),0]=rgbHist[np.int(index),0]+1
return rgbHist
def hist_compare(image1,image2):
hist1=create_rgb_hist(image1)
hist2=create_rgb_hist(image2)
match1=cv.compareHist(hist1,hist2,cv.HISTCMP_BHATTACHARYYA)#巴氏距离:越小越相似
match2=cv.compareHist(hist1,hist2,cv.HISTCMP_CORREL)#相关性:越接近于1越相似
match3=cv.compareHist(hist1,hist2,cv.HISTCMP_CHISQR)#卡方:越小越相似
print("巴氏距离:%d 相关性:%d 卡方:%d"%(match1,match2,match3))
直方图反向投影
**2d直方图怎么建立与显示**
def hist2d_demo(image):
hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
#calcHist函数来计算图像直方图
hist=cv.calcHist([image],[0,1],None,[180,256],[0,180,0,256])
plt.imshow(hist,interpolation='nearest')
plt.title("2D wistogram")
plt.show()
**反向投影**
def back_projection_demo():
#样本
sample=cv.imread(r"C:/Users/admin/Pictures/zyl/zhuanhuan/muban/none.jpg")
#检测目标
target=cv.imread(r"C:/Users/admin/Pictures/zyl/zhuanhuan/Test2.jpg")
#要把样本转换成HSV色彩空间
roi_hsv=cv.cvtColor(sample,cv.COLOR_BGR2HSV)
target_hsv=cv.cvtColor(target,cv.COLOR_BGR2HSV)
#显示出来
#cv.imshow("sample",sample)
#cv.imshow("target",target)
#直方图
roiHisrt=cv.calcHist([roi_hsv],[0,1],None,[36,48],[0,180,0,256])#反向投影的影响度[36,48]
cv.normalize(roiHisrt,roiHisrt,0,255,cv.NORM_MINMAX)
#反向投影
dst= cv.calcBackProject([target_hsv],[0,1],roiHisrt,[0,180,0,256],1)
cv.imshow("backProjectionDem",dst)