从本学期开始,我们就要进行有关计算机视觉的学习。计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。作为一个科学学科,计算机视觉研究相关的理论和技术,试图建立能够从图像或者多维数据中获取‘信息’的人工智能系统。这里所 指的信息指Shannon定义的,可以用来帮助做一个“决定”的信息。因为感知可以看作是从感官信号中提 取信息,所以计算机视觉也可以看作是研究如何使人工系统从图像或多维数据中“感知”的科学。
把白色和黑色之间按照对数关系分为若干个等级,称为灰度。灰度一共分为256阶。
用灰度表示的图像称为灰度图像。
任何颜色都有红、绿、蓝三原色(RGB)组成,而灰度图像只有一个通道,有256个灰度等级,255表示最白,0表示最黑。
在实验中,我使用了convert()实现由彩色图像向灰度图像的转换
PIL中convert()的原理:
PIL有九种不同的模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
为二值图像,非黑即白。每个像素用8个bit表示,0表示黑,255表示白。
为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
转换公式:L = R * 299/1000 + G * 587/1000+ B * 114/1000。
直方图是可以对整幅图的灰度分布进行整体表示的图示。我们可以通过直方图对图像的对比度、亮度和灰度分布有一个直观的了解。
图像的直方图是用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。该图像的直方图可以使用hist()函数绘制。代码如下:
from PIL import Image
from pylab import *
"""
函数说明:绘制直方图
Parameters:
无
Returns:
无
"""
def Histogram():
# 读取图像到数组中并转换成灰度图像
img = array(Image.open('flower.jpg').convert('L'))
# 新建一个图像
figure()
hist(img.flatten(), 128)
show()
if __name__ == '__main__':
Histogram()
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。
通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素点,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值
代码如下:
from PIL import Image
from pylab import *
from scipy.ndimage import filters
"""
函数说明:高斯滤波
Parameters:
无
Returns:
无
"""
def Gaussian():
img = array(Image.open('flower.jpg').convert('L'))
figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title('原图')
imshow(img)
for bi, blur in enumerate([2, 5, 10]):
img2 = zeros(img.shape)
img2 = filters.gaussian_filter(img, blur)
img2 = np.uint8(img2)
imNum=str(blur)
subplot(1, 4, 2 + bi)
axis('off')
title('标准差为'+imNum)
imshow(img2)
show()
if __name__ == '__main__':
#高斯滤波
mpl.rcParams['font.sans-serif'] = ['SimHei']
Gaussian()
一副效果好的图像通常在直方图上的分布比较均匀,直方图均衡化就是用来改善图像的全局亮度和对比度。
直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增强图像的对比度。
直方图均衡化的变换函数是图像中像素值的累积分布函数(cumulative distribution function,简写为 cdf,将像素值的范围映射到目标范围的归一化操作)。
直方图均衡化的变换函数是图像中像素值的累积分布函数。
代码如下:
from PIL import Image
from pylab import *
from numpy import *
"""
函数说明:直方图均衡化
Parameters:
img:灰度图像
nbr_bins=256:直方图使用小区间的数目
Returns:
img2.reshape(img.shape):直方图均衡化后的图像
cdf:用来做像素值映射的累积分布函数
"""
def Histeq(img,nbr_bins=256):
#计算图像的直方图
imhist,bins=histogram(img.flatten(),nbr_bins)
#累计分布函数
cdf = imhist.cumsum()
#归一化
cdf = 255*cdf/cdf[-1]
#使用累积分布函数的线性插值,计算新的像素值
img2 = interp(img.flatten(),bins[:-1],cdf)
return img2.reshape(img.shape),cdf
if __name__ == '__main__':
#直方图均衡化
#解决title是方框的问题
mpl.rcParams['font.sans-serif'] = ['SimHei']
img = array(Image.open('flower.jpg').convert('L'))
img2,cdf = Histeq(img)
figure()
subplot(2, 2, 1)
#关闭所有坐标轴线、刻度标记和标签
axis('off')
gray()
title('原始图像')
imshow(img)
subplot(2, 2, 2)
axis('off')
title('直方图均衡化后的图像')
imshow(img2)
subplot(2, 2, 3)
axis('off')
title('原始直方图')
# hist(im.flatten(), 128, cumulative=True, normed=True)
hist(img.flatten(), 128)
subplot(2, 2, 4)
axis('off')
title('均衡化后的直方图')
# hist(im2.flatten(), 128, cumulative=True, normed=True)
hist(img2.flatten(), 128)
show()
本文仅仅是对计算机视觉一些基础操作的简单介绍,在后续的学习生活中,我会继续更加深入的了解。希望这学期我可以在这门课中收获更多。