1.直方图
1.1基本原理
灰度级范围为[0,L-1]的数字图像的直方图是离散函数h(rk)=nk,其中rk是第k级灰度值,nk是图像中灰度为rk的像素个数。在实践中,经常用乘积MN表示的图像像素的总数除它的每个分量来归一化直方图,通常M和N是图像的行和列的维数。因此,归一化后的直方图由p(rk)=nk/MN给出,其中k=0,1,…,L-1。简单来说,p(rk)是灰度级rk在图像中出现的概率的一个估计。归一化直方图的所有分量之和应等于1。
在直方图中,暗图像集中分布在灰度级的低端;亮图像集中分布在灰度级的高端。低对比度图像具有较窄的直方图,且集中于灰度级的中部;高对比度图像的直方图分量则覆盖了很宽的灰度级范围。
1.2代码
from PIL import Image
from pylab import *
if __name__=='__main__':
im = array(Image.open('qq.jpg'))
imshow(im)
title('Original picture')
figure()
hist(im.flatten(),350)
title('Histogram')
show()
figure()
1.3运行结果
2.直方图均衡化
2.1基本原理
图像灰度变换中一个非常有用的例子就是直方图均衡化。直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好 的方法,并且可以增强图像的对比度。
在这种情况下,直方图均衡化的变换函数是图像中像素的累积分布函数(简称cdf,将像素值的范围映射到目标范围的归一化操作)。
如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。
2.2代码
from PIL import Image
from matplotlib.pyplot import figure, subplot, axis, gray, title, imshow, hist, show
from numpy import histogram, interp, array
def histeq(im, nbr_bins=256):
"""对一幅灰度图像进行直方图均衡化"""
# 计算图像的直方图
imhist, bins = histogram(im.flatten(), nbr_bins, normed=True)
cdf = imhist.cumsum() # 累积分布函数
cdf = 255 * cdf / cdf[-1] # 归一化
# 使用累积分布函数的线性插值,计算新的像素值
im2 = interp(im.flatten(), bins[:-1], cdf)
return im2.reshape(im.shape), cdf
im = array(Image.open('1.JPG').convert('L'))
im2, cdf = histeq(im)
gray()
title('(a)Original Image')
imshow(im)
figure()
title('(b)Image After Histogram Equalization')
imshow(im2)
figure()
title('(c)Histogram Of Original Image')
hist(im.flatten(), 128, density=True)
figure()
title('(d)Histogram After Equalization')
hist(im2.flatten(), 128, density=True)
show()
2.3运行结果
3.高斯滤波
3.1基本原理
二维高斯模糊,或者说高斯滤波,是图像处理中非常常见的操作。操作的核心是使用一个从高斯分布中采样得到的掩膜,或者叫核,和输入图片中的每个像素及其邻域进行计算,结果保存到输出图片中。假设高斯核窗口尺寸为,高斯分布的标准差为 ,则高斯核可以表示为矩阵的形式
高斯模糊实现原理
类似于均值滤波(用周围像素点的均值最为中心点的像素值),二维高斯函数滤波也是利用某点周围的数值进行高斯模型处理,再将处理的数值作为该点的像素值。
这里二维高斯模型为:
为了计算出周围高斯函数各个点的权重,设计一个9宫格:
以坐标值作为(x,y)的坐标值,计算每点的权重值如下(这里σ = 1.5),这样九个点的像素权值取如下:
为了计算加权平均,必须得使得9个点的和为1,即将所有点都乘以:2.0889268,得到如下权值矩阵:
在这里插入图片描述
3.2代码
from PIL import Image
from numpy import *
from numpy import array, zeros
from scipy.ndimage import filters
from pylab import *
if __name__=='__main__':
im = array(Image.open('2.JPG').convert('L'))
gray()
subplot(2, 2, 1)
axis('off')
title('Original Image')
imshow(im)
for bi, blur in enumerate([10, 20, 30]):
im2 = zeros(im.shape)
im2 = filters.gaussian_filter(im, blur)
im2 = np.uint8(im2)
imNum = str(blur)
subplot(2, 2, 2 + bi)
axis('off')
title('GaussVar = ' + imNum)
imshow(im2)
show()