计算机视觉--python图像处理基础

前言

    图像处理的研究领域,大家熟知的有Matlab,本章介绍python语言的基础图像处理。Python 里面最常用的图像操作库是Image library(PIL),在实验开始前,首先进行软件安装与环境搭建,我需要的主要文件包括Anadacon2(Python2.7)、PCV库、VLfeat,使用pycharm作为第三方工具,还要注意环境变量的配置。下面对直方图、高斯滤波、直方图均衡化进行介绍。

一、图像轮廓和直方图

1.1 原理介绍

  • 当载入图像时,通过调用array() 方法将图像转换成NumPy的数组对象。NumPy中的数组对象是多维的,可以用来表示向量、矩阵和图像。通过对图像的数组进行直接操作,就可以完成很多图像处理。
  • 读取图片:im=Image.open('../data/empire.jpg')
  • convert()函数,用于不同模式图像之间的转换。PIL中有九种不同模式,分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。模式L为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:
    L = R * 0.299 + G * 0.587+ B * 0.114
  • contourf()和contour()一般用来画等高线图。这两个函数就差一个字母,除了画出来得图有些差别,用法一样,区别如下:一个填充等高线之间的空间一个不填充。
  • 图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。该(灰度)图像的直方图可以使用hist() 函数绘制: hist(im.flatten(), 128)
    hist() 函数的第二个参数指定小区间的数目。需要注意的是,因为 hist()只接受一维数组作为输入,所以我们在绘制图像直方图之前,必须先对图像进行压平处理。flatten()方法将任意数组按照行优先准则转换成一维数组。

1.2 代码实现及结果

from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('../data/empire.jpg').convert('L'))  # 打开图像,并转成灰度图像

figure()
subplot(121)
gray()
contour(im, origin='image')
axis('equal')
axis('off')
title(u'图像轮廓', fontproperties=font)

subplot(122)
hist(im.flatten(), 128)
title(u'图像直方图', fontproperties=font)
plt.xlim([0,260])
plt.ylim([0,2600])

show()

结果如下:
在这里插入图片描述
分析:从图像直方图可看出这张图像的灰度值主要分布在[100,250]之间。

二、高斯滤波(高斯模糊)

2.1 原理介绍

  • 高斯模糊又叫高斯滤波,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
  • 高斯滤波器:im2 = filters.gaussian_filter(im, blur)。自变量:im:原始图,输入到函数的是矩阵,blur: 标量或标量序列,blur越大图像越模糊。返回值是和输入形状一样的矩阵。

2.2 代码实现及结果

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from scipy.ndimage import filters

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

#im = array(Image.open('board.jpeg'))
im = array(Image.open('../data/empire.jpg').convert('L'))

figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title(u'原图', fontproperties=font)
imshow(im)

for bi, blur in enumerate([2, 5, 10]):
  im2 = zeros(im.shape)
  im2 = filters.gaussian_filter(im, blur)
  im2 = np.uint8(im2)
  imNum=str(blur)
  subplot(1, 4, 2 + bi)
  axis('off')
  title(u'标准差为'+imNum, fontproperties=font)
  imshow(im2)

#如果是彩色图像,则分别对三个通道进行模糊
#for bi, blur in enumerate([2, 5, 10]):
#  im2 = zeros(im.shape)
#  for i in range(3):
#    im2[:, :, i] = filters.gaussian_filter(im[:, :, i], blur)
#  im2 = np.uint8(im2)
#  subplot(1, 4,  2 + bi)
#  axis('off')
#  imshow(im2)

show()

结果如下:
在这里插入图片描述
分析:上面第一幅图为待模糊图像,第二幅用高斯标准差为2进行模糊,第三幅用高斯标准差为5进行模糊,最后一幅用高斯标准差为10进行模糊,可以看出标准差越大,图像模糊程度越高。

三、直方图均衡化

3.1 原理介绍

  • 如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像原取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。
  • 直方图均衡化函数:histeq(im)
  • 图像的坐标轴是一个很有用的调试工具;但是,如果你想绘制出较美观的图像,加上下列命令可以使坐标轴不显示:axis('off')

3.2 代码实现及结果

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.tools import imtools

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

im = array(Image.open('../data/empire.jpg').convert('L'))  # 打开图像,并转成灰度图像
#im = array(Image.open('../data/AquaTermi_lowcontrast.JPG').convert('L'))
im2, cdf = imtools.histeq(im)

figure()
subplot(2, 2, 1)
axis('off')
gray()
title(u'原始图像', fontproperties=font)
imshow(im)

subplot(2, 2, 2)
axis('off')
title(u'直方图均衡化后的图像', fontproperties=font)
imshow(im2)

subplot(2, 2, 3)
axis('off')
title(u'原始直方图', fontproperties=font)
#hist(im.flatten(), 128, cumulative=True, normed=True)
hist(im.flatten(), 128, normed=True)

subplot(2, 2, 4)
axis('off')
title(u'均衡化后的直方图', fontproperties=font)
#hist(im2.flatten(), 128, cumulative=True, normed=True)
hist(im2.flatten(), 128, normed=True)

show()

结果如下:
在这里插入图片描述
分析:如上图所示,原始图像的直方图主要集中在灰度值较大处,而对应的灰度图看起来很亮,经直方图均衡化后的直方图灰度分布要比较均匀,均衡化后的图像看起来更清晰柔和。

发布了9 篇原创文章 · 获赞 1 · 访问量 946

猜你喜欢

转载自blog.csdn.net/qq_41784565/article/details/104454465