资讯专栏INFORMATION COLUMN

Programming Computer Vision with Python (学习笔记五)

Rocko / 1997人阅读

摘要:下面是二维空间的高斯分布函数公式这个公式被称作高斯核。高斯模糊使用高斯平均算子来实现的图像模糊叫高斯模糊,也叫高斯平滑被认为是一种最优的图像平滑处理。

SciPy库

SciPy库,与之前我们使用的NumPy和Matplotlib,都是scipy.org提供的用于科学计算方面的核心库。相对NumPy,SciPy库提供了面向更高层应用的算法和函数(其实也是基于NumPy实现的),并以子模块的形式组织,每个子模块对应不同的应用领域,下面列出我们关心的一部分进行说明:
constants:物理和数学常量
fftpack:快速傅里叶(立)变换
integrate: 积分和方程
interpolate: 插值
linalg: 线性代数
ndimage: N维图像处理
optimize: 优化及根求解

安装

sudo apt-get install python-scipy
图像模糊数学原理

以灰度图像为例,把图像的每个像素的灰度值,变换为它周围邻近的N个像素值的平均值,得出的图像就有了模糊效果,但这种效果不理想,体现不出边缘(不够自然吧),所以提出了一种比较理想的方法,就是使用加权平均值,因为对某个像素而言,离它越近的像素,与它的关联性越高,所以权值应该越大,相反,离它越远的像素,与它的关联性越低,权值应该越小。

那分配权值应该使用什么样的算法呢?最常用的就是高斯分布函数

高斯分布函数其实应该是高斯分布的概率密度函数,简称高斯分布函数正态分布函数,它的二维空间的形态像一个,如图:

这里我们只关心二维的高斯分布函数,因为等下我们要把它应用在二维图像的像素的权值分配上。下面是二维空间的高斯分布函数公式:

这个公式被称作高斯核。如果我们给定sigma(如0.84089642)的值,以及高斯分布的(范围)大小,就可以得出一个矩阵如:

注意中心元素 (4,4)处有最大值,随着距离中心越远,数值一圈圈地对称减小。这样,矩阵的每个元素相对中心点的权值就已经知道了,如果我们把这个矩阵的中心对应到图像的每个点,就可以知道中心点对应的像素应该如何通过周围的点来计算。

如果矩阵的中心对应到原图像边沿的像素点,那么可能有一部分矩阵的元素落到图像之外,为保证能正常运算,一种简单的处理就是把图像一边的数据复制到缺少的一边去。

对原图像的每个像素点,运用上面的权值矩阵,算出加权平均值,作为新图像的像素值,这个运算可以用原图像与矩阵的卷积来表示,而参与卷积的这个矩阵,叫模板,这种卷积运算,叫模板卷积。模板也称为算子。上面示例的这个矩阵,其实就是高斯平均算子。

高斯模糊

使用高斯平均算子来实现的图像模糊叫高斯模糊(Gaussian blurring,也叫高斯平滑)
被认为是一种最优的图像平滑处理。除了模糊,还可以用来磨皮(美颜)、制作景深、实现梦幻效果等。下面我们使用Python来对一幅图像进行模糊处理。

我们不必自己实现高斯模糊的计算过程,因为前面介绍的scipy的ndimage子模块中就包含了高斯滤波器,它是一个函数:

scipy.ndimage.filters.gaussian_filter(input, sigma, order=0, ...
多维高斯滤波器
input: ndarray
sigma: 高斯核标准偏差,越大越模糊
order: 默认0,使用高斯核进行计算,还可以指定不同值使用高斯一阶、二阶导数,以后再说

以下代码示例以sigma为2,5,10分别对一张图像进行模糊,我们使用的是GRB图像,有3个通道,必须对每个通道都应用滤波器:

from PIL import Image
import numpy as np
from scipy.ndimage import filters
import matplotlib.pyplot as plt

im = np.array(Image.open("Penguins.jpg"))

index = 141  #画1行四列的图,与 1,4,1 同
plt.subplot(index)
plt.imshow(im)

for sigma in (2, 5, 10):
    im_blur = np.zeros(im.shape, dtype=np.uint8)
    for i in range(3):  #对图像的每一个通道都应用高斯滤波
        im_blur[:,:,i] = filters.gaussian_filter(im[:,:,i], sigma)

    index += 1
    plt.subplot(index)
    plt.imshow(im_blur)

plt.show()

不同的sigma模糊程度对比:

小结

下一个笔记将记录有关图像边缘检测的实现,还会继续运用模板卷积运算,将涉及到图像导数,以及用于边缘检测的常用算子的介绍。

参考资料
维基百科:高斯模糊
高斯模糊浅析
高斯模糊的算法
[计算机视觉特征提取与图像处理(第三版)]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44184.html

相关文章

  • SegmentFault 技术周刊 Vol.30 - 学习 Python 来做一些神奇好玩的事情吧

    摘要:学习笔记七数学形态学关注的是图像中的形状,它提供了一些方法用于检测形状和改变形状。学习笔记十一尺度不变特征变换,简称是图像局部特征提取的现代方法基于区域图像块的分析。本文的目的是简明扼要地说明的编码机制,并给出一些建议。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 开始之前,我们先来看这样一个提问: pyth...

    lifesimple 评论0 收藏0
  • Programming Computer Vision with Python学习笔记一)

    摘要:接下来的学习笔记本人都将使用来代替。库中提供的很多图像操作都是分别作用于某个通道的数据。是最流行的开源色彩管理库之一。目前只支持在增加和。模块支持从图像对象创建或的对象,方便被使用和显示。模块对图像或指定区域的每个通道进行统计,包括等。 介绍 《Programming Computer Vision with Python》是一本介绍计算机视觉底层基本理论和算法的入门书,通过这本收可以...

    huashiou 评论0 收藏0
  • Programming Computer Vision with Python学习笔记八)

    摘要:简称库是从扩展下来的,提供了更丰富的图像处理函数,去噪函数除了还有算法,比如边缘检测还有以前简单提过的算子滤波器。下面我用看具体的例子,将和高斯平滑进行对比效果对比如下明显感觉使用的效果要比高斯平滑好很多。 图像去噪(Image Denoising)的过程就是将噪点从图像中去除的同时尽可能的保留原图像的细节和结构。这里讲的去噪跟前面笔记提过的去噪不一样,这里是指高级去噪技术,前面提过的...

    FleyX 评论0 收藏0
  • Programming Computer Vision with Python学习笔记十二)

    摘要:图像矩图像矩或称几何矩是由在年提出的。矩给出了对图像形状的一种度量。使用建议的第二种采样方法即以图像中心进行高斯分布采样,长度使用,然后在基础上增加了旋转的描述以及快速的计算方法,这种方法被称为。 ORB(Oriented FAST and Rotated BRIEF)可用来替代SIFT(或SURF),它对图像更具有抗噪特性,是一种特征检测高效算法,其速度满足实时要求,可用于增强图像匹...

    xbynet 评论0 收藏0

发表评论

0条评论

Rocko

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<