1.直方图比较
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
def show(img):
if img.ndim==2:
plt.imshow(img,cmap='gray')
else:
img2=cv.cvtColor(img,cv.COLOR_BGR2RGB)
plt.imshow(img2)
plt.show()
img1=cv.imread('pic/petal200x300.jpg')
img2=cv.imread('pic/petal500x500.jpg')
img3=cv.imread('pic/parrot500x450.jpg')
#图片构成list
imgs=[img1,img2,img3]
#获得个图像的直方图,这里注意cv.calcHist([img],[0],None,[64],[0,256])中的都是[],都是list形式
#[img]中放至多张图片,[0]代表0(b)通道,None是mask,[64]为bits代表直方图共64段,[0,256]代表直方图的范围。
hists=[cv.calcHist([img],[0],None,[64],[0,256]) for img in imgs]
#要对hist进行归一化且转换为浮点类型,compareHist就是要用到浮点类型
hists=[(hist/img.size*3).astype(np.float32) for (hist,img) in zip(hists,imgs)]
#分别对图1图2进行比较,对图2图3进行比较比较的方式是相关系数比较
#相关系数的范围在[-1,1],越接近-1越负相关,越接近1越正相关,越接近0越无关
corr1=cv.compareHist(hists[0],hists[1],cv.HISTCMP_CORREL)
corr2=cv.compareHist(hists[1],hists[2],cv.HISTCMP_CORREL)
print(corr1,corr2)
#循环绘制
[plt.plot(hist) for hist in hists]
plt.show()
for img in imgs:
show(img)
2.直方图均衡化
1.具体均衡化步骤
实现公式:
S
(
r
)
=
(
L
−
1
)
∑
i
=
0
r
n
r
N
S(r)=(L-1)\sum_{i=0}^r\frac{n_r}{N}
S(r)=(L−1)i=0∑rNnr
1.灰度图片读取。
2.对灰度图片进行直方图的计算得到
h
i
h_i
hi。
3.计算灰度分布频率
f
i
f_i
fi,计算方法为:
h
i
/
(
w
∗
h
)
h_i/(w*h)
hi/(w∗h)。
4.计算累计频率
a
i
a_i
ai,
a
i
a_i
ai为前
i
i
i项
f
i
f_i
fi之和。
5.对计算结果进行四舍五入取整型。
6.实现从原图像到均衡化图像的映射。
2.实现代码
%%time
#S(r)=K/N(n0+n1+n2...nr)
img= cv.imread('pic/wolf500x750.jpg',0)
#计算灰度直方图
hist=cv.calcHist([img],[0],None,[256],[0,256])
#计算灰度分布频率f,f=hist/(w*h),直方图/图片大小
f=hist/img.size
L=256
#累计分布频率
a=np.cumsum(f)
#四舍五入
s=np.round(a*(L-1)).astype(np.uint8)
#1等同于下面双循环,%%time可以对比两个程序的运行时间
equ1=s[img]
#对equ1进行初始化赋值
# equ1=np.zeros_like(img)
# #
# for i in range(img.shape[0]):
# for j in range(img.shape[1]):
# r=img[i,j]
# equ1[i,j]=s[r]
show(equ1)
plt.plot(f)
plt.show()