计算机视觉-图像基础处理
一,直方图
图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。图像的直方图可以使用 hist() 函数绘制。hist() 函数的第二个参数指定小区间的数目。需要注意的是,因为 hist() 只接受一维数组作为输入,所以我们在绘制图像直方图之前,必须先对图像进行压平处理。flatten() 方法将任意数组按照行优先准则转换成一维数组。
代码如下:
1 # -*- coding: utf-8 -*-
2 from PIL import Image
3 from pylab import *
4
5 # 添加中文字体支持
6 from matplotlib.font_manager import FontProperties
7 font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
8 im = array(Image.open('../data/empire.jpg').convert('L')) # 打开图像,并转成灰度图像
9
10 figure()
11 subplot(121)
12 #不使用颜色信息
13 gray()
14 #在原点的左上角显示轮廓图像
15 contour(im, origin='image')
16 axis('equal')
17 axis('off')
18 title(u'图像轮廓', fontproperties=font)
19
20 subplot(122)
21 hist(im.flatten(), 128)
22 title(u'图像直方图', fontproperties=font)
23 plt.xlim([0,260])
24 plt.ylim([0,11000])
25
26 show()
效果:

二,直方图均衡化
图像灰度变换中一个非常有用的例子就是直方图均衡化。直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增强图像的对比度。
代码如下:
1 # -*- coding: utf-8 -*-
2 from PIL import Image
3 from pylab import *
4 from PCV.tools import imtools
5
6 # 添加中文字体支持
7 from matplotlib.font_manager import FontProperties
8 font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
9
10 im = array(Image.open('../data/empire.jpg').convert('L')) # 打开图像,并转成灰度图像
11 #im = array(Image.open('../data/AquaTermi_lowcontrast.JPG').convert('L'))
12 im2, cdf = imtools.histeq(im)
13
14 figure()
15 subplot(2, 2, 1)
16 axis('off')
17 gray()
18 title(u'原始图像', fontproperties=font)
19 imshow(im)
20
21 subplot(2, 2, 2)
22 axis('off')
23 title(u'直方图均衡化后的图像', fontproperties=font)
24 imshow(im2)
25
26 subplot(2, 2, 3)
27 axis('off')
28 title(u'原始直方图', fontproperties=font)
29 #hist(im.flatten(), 128, cumulative=True, normed=True)
30 hist(im.flatten(), 128, normed=True)
31
32 subplot(2, 2, 4)
33 axis('off')
34 title(u'均衡化后的直方图', fontproperties=font)
35 #hist(im2.flatten(), 128, cumulative=True, normed=True)
36 hist(im2.flatten(), 128, normed=True)
37
38 show()
效果:

三,高斯滤波
高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。其滤波核的值由如下公式得到(用当前点与中心点的欧式距离的平方代替下面的
(x2+y2):

代码如下:
1 # -*- coding: utf-8 -*-
2 from PIL import Image
3 from pylab import *
4 from scipy.ndimage import filters
5
6 # 添加中文字体支持
7 from matplotlib.font_manager import FontProperties
8 font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
9
10 #im = array(Image.open('board.jpeg'))
11 im = array(Image.open('../data/empire.jpg').convert('L'))
12
13 figure()
14 gray()
15 axis('off')
16 subplot(1, 4, 1)
17 axis('off')
18 title(u'原图', fontproperties=font)
19 imshow(im)
20
21 for bi, blur in enumerate([2, 5, 10]):
22 im2 = zeros(im.shape)
23 im2 = filters.gaussian_filter(im, blur)
24 im2 = np.uint8(im2)
25 imNum=str(blur)
26 subplot(1, 4, 2 + bi)
27 axis('off')
28 title(u'标准差为'+imNum, fontproperties=font)
29 imshow(im2)
效果:

四,总结
通过本次实验对于使用python对图像的基本处理有了更多的了解。直方图可以直观地反映图像像素值的分布特征。在绘制直方图时,需要先将图像灰度化,绘制图像轮廓,对图像的像素进行统计。因为hist只接受一维数组作为输入,所以要先对图像进行压平处理,而flatten可以将数组按行优先原则转换成一维数组。
直方图增强的方法就是压缩直方图中比例少的像素所占用的灰度范围,多出来的灰度空间按照统计比例分配给直方图中比例高的像素使用,使其分布更加均匀。直方图均衡化可以通过减少图像的灰度级来加大对比度,使图像变清晰达到增强图像的显示效果的作用,均衡化后的这些图像会更有利于人眼的观看识别。

浙公网安备 33010602011771号