灰度直方图就是把图中所有像素点的灰度做一个统计,然后画出的一个直方图。
对于灰度图来说,它是一个非常重要的特征,能够反映一张灰度图的分布特征。
对于一个5 x 5的灰度图来说,其像素值如下:(假设只有0-9这10个灰度)
8 | 9 | 2 | 5 | 4 |
5 | 1 | 0 | 4 | 3 |
6 | 4 | 3 | 8 | 0 |
2 | 5 | 4 | 6 | 8 |
7 | 4 | 3 | 2 | 9 |
那么对于这个图,我们统计它的灰度
灰度 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
频率 | 2 | 1 | 3 | 3 | 5 | 3 | 2 | 1 | 3 | 2 |
那么画出他的灰度直翻图就为
↑ | ||||||||||
| | 1234 | |||||||||
| | 1234 | |||||||||
| | 1234 | 1234 | 1234 | 1234 | 1234 | |||||
| | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | ||
| | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 | 1234 |
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
图画得有点丑啊- -包涵一下囧。
下面是代码的实现。
#直方图
def histogram(img , Canvas):
h,w = img.size
pix = img.load()
frequency = [0] * 256
for i in range (h):
for j in range (w):
frequency[pix[i,j]] = frequency[pix[i,j]] + 1
if (Canvas == oldHisCanvas):
histogramInfo(frequency , oldHisInfoCanvas , h , w)
else :
histogramInfo(frequency , newHisInfoCanvas , h , w)
s = max(frequency)
each = s * 1.0 / 80
hisImage = Image.new('L',(256 , 100));
npix = hisImage.load()
for i in range (255):
for j in range (100):
npix[i,j] = 255;
for i in range (256):
for j in range (100):
if frequency[i] < round((100 - j) * each , 0):
npix[i,j] = 255;
else:
npix[i,j] = 0;
showPicture(hisImage , Canvas)
这里我画出直方图的方法是类似于上边填表格的方法填充像素点得到的一张图片,画得也不怎么好看。如果大家想得到比较好看的灰度图,可以百度一下,使用python相关的numpy,scipy,matplotlib等好多都可以画出比较美观的直方图。
以下是效果图:
顺带说一句- -灰度直方图是统计灰度图的,别被这张彩色图给吓到了,处理前我有转成灰度图哦。
owari