图像的直方图
图像的直方图是用以表示数字图像中亮度分布的直方图,描绘图像中每个亮度值的像素个数,有两个特点:
- 不同灰度级分布构成不同图像
-
直方图的均衡化
均衡化的过程就是:对图像中像素个数多的灰度值进行展宽,而对像素值个数少的灰度值进行归并,从而增大对比度,使图像清晰,达到图像增强的目的。
1.均衡化的优缺点
优点:对于背景和前景都太亮或太暗额图像非常有用,直观的技术实现,并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量并不大。
- 缺点:它对处理的数据并没有选择,可能会增加噪音并且降低有用的信号对比度。变换后图像的灰度级减少,某些细节消失。某些图像,如直方图有高峰,处理后会有过分增强的情况。
2.均衡化的步骤
- 计算每个灰度值的像素个数
- 计算每个灰度值出现的频率
- 计算每个灰度值的累计频率,如灰度值2的累计频率=灰度值1的累计频率+灰度值2的频率
- 用总灰度值个数乘以每个灰度值的累计频率,然后近似为最接近的整数
最后将当前灰度值映射到最接近整数的灰度值上来增强图像的对比度
3.均衡化源码
```python
对原图像进行均衡化
for i in range(256):
mHist1.append(0)
row,col=img.shape#获取原图像像素点的宽度和高度
for i in range(row):
for j in range(col):mHist1[img[i,j]]= mHist1[img[i,j]]+1#统计灰度值的个数
mNum1.append(mHist1[0]/img.size)
for i in range(0,255):
mNum1.append(mNum1[i]+mHist1[i+1]/img.size)
for i in range(256):
inhist1.append(round(255*mNum1[i]))
对目标图像进行均衡化
for i in range(256):
mHist2.append(0)
rows,cols=scr.shape#获取目标图像像素点的宽度和高度
for i in range(rows):
for j in range(cols):mHist2[scr[i,j]]= mHist2[scr[i,j]]+1#统计灰度值的个数
mNum2.append(mHist2[0]/scr.size)
for i in range(0,255):
mNum2.append(mNum2[i]+mHist2[i+1]/scr.size)
for i in range(256):
inhist2.append(round(255*mNum2[i]))
<a name="ubtfh"></a># 直方图的规定化直方图的规定化是当需要图像具有某一特定的直方图形状时使用的变换方式。<br />直方图规定化的目的灰度直方图是已知的。<a name="enyYS"></a>## 1.规定化的步骤1. 对原图像先进行均衡化,对目标图像进行均衡化1. 通过均衡化作为中间结果,得到原始图像和目标图像之间的映射关系。<a name="LuwCO"></a>## 2.规定化源码```python#进行规定化g=[]#用于放入规定化后的图片像素for i in range(256):a=inhist1[i]flag=Truefor j in range(256):if inhist2[j]==a:g.append(j)flag=Falsebreakif flag==True:minp=255for j in range(256):b=abs(inhist2[j]-a)if b<minp:minp=bjmin=jg.append(jmin)for i in range(row):for j in range(col):img[i,j]=g[img[i,j]]
查看效果源码
cv2.imshow("原图",img0)cv2.waitKey(0)plt.hist(img0.ravel(),256)plt.show()cv2.imshow("目标图",scr)cv2.waitKey(0)plt.hist(scr.ravel(),256)plt.show()cv2.imshow("规定化",img)cv2.waitKey(0)plt.hist(img.ravel(),256)plt.show()
