首先我们知道一张图片的所有颜色都可以通过RGB值调节进行表示,如果是一张彩色图片则RBG值不一定相同,将彩色图片灰度化就是指的是将彩色图片变成黑白的,这时候的RBG三个通道的值是相同的,就是将一幅色彩图像转化为灰度图像的过程。
彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程。灰度值大的像素点比较亮(像素值最大为255,为白色),反之比较暗(像素最下为0,为黑色)这个过程就是指灰度化。
对图像灰度化便于后续对图像的特征进行提取,以及得到图像的灰度曲线图
from PIL import Image
from pylab import *
from PCV.tools import imtools
from scipy.ndimage import filters
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#灰度化
pil_im = Image.open('data/test/no/122.jpg')
gray()
subplot(121)
axis('off')
title('原图')
imshow(pil_im)
pil_im = Image.open('data/test/no/122.jpg').convert('L')
subplot(122)
axis('off')
title('灰度图')
imshow(pil_im)
show()
轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。
• 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理
或者 Canny 边界检测。
• 查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图
像的话,你应该将原始图像存储到其他变量中。
在图像处理中, 经常用到直方图, 如颜色直方图、 灰度直方图等。
图像的灰度直方图就描述了图像中灰度分布情况, 能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级的函数, 描述的是图像中具有该灰度级的像素的个数: 其中, 横坐标是灰度级, 纵坐标是该灰度级出现的率。
① 直方图反映了图像中的灰度分布规律。 它描述每个灰度级具有的像素个数, 但不包含这些像素在图像中的位置信息。 图像直方图不关心像素所处的空间位置, 因此不受图像旋转和平移变化的影响, 可以作为图像的特征。
② 任何一幅特定的图像都有唯一的直方图与之对应, 但不同的图像可以有相同的直方图。
③如果一幅图像有两个不相连的区域组成, 并且每个区域的直方图已知, 则整幅图像的直方图是该两个区域的直方图之和。
import matplotlib.pyplot as plt
from PIL import Image
from pylab import *
from PCV.tools import imtools
from scipy.ndimage import filters
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#图像轮廓
im = array(Image.open('data/test/no/122.jpg').convert('L'))#打开图像并读入数组
figure()
subplot(121)
gray()#不使用颜色信息
contour(im,origin='image')#在原点的左上角显示轮廓信息
axis('equal')
axis('off')
title('图像轮廓')
#直方图
subplot(122)
hist(im.flatten(),128)
title('直方图')
plt.xlim([0,260])
plt.ylim([0,11000])
show()
直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布通过累积分布函数变成近似均匀分布,从而增强图像的对比度。为了将原图像的亮度范围进行扩展, 需要一个映射函数, 将原图像的像素值均衡映射到新直方图中, 这个映射函数有两个条件:
①不能打乱原有的像素值大小顺序, 映射后亮、 暗的大小关系不能改变;
② 映射后必须在原有的范围内,即像素映射函数的值域应在0和255之间;
综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。
将这个函数添加到imtool.py文件里
def histeq(im,nbr_bins=256):
""" 对一幅灰度图像进行直方图均衡化"""
# 计算图像的直方图
imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum() # cumulative distribution function
cdf = 255 * cdf / cdf[-1] # 归一化
# 使用累积分布函数的线性插值,计算新的像素值
im2 = interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape), cdf
#直方图均衡化
im = array(Image.open('data/test/no/122.jpg').convert('L')) # 打开图像,并转成灰度图像
im2, cdf = imtools.histeq(im) #上述详解imtools.histeq函数
figure()
subplot(2, 2, 1)
axis('off')
gray()
title('原始图像')
imshow(im)
subplot(2, 2, 2)
axis('off')
title('直方图均衡化后的图像',)
imshow(im2)
subplot(2, 2, 3)
axis('off')
title('原始直方图')
hist(im.flatten(), 128)
subplot(2, 2, 4)
axis('off')
title('均衡化后的直方图')
hist(im2.flatten(), 128)
show()
高斯模糊实质上就是一种均值模糊,只是高斯模糊是按照加权平均的,距离越近的点权重越大,距离越远的点权重越小。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显
import matplotlib.pyplot as plt
from PIL import Image
from pylab import *
from PCV.tools import imtools
import numpy as np
from scipy.ndimage import filters
#高斯滤波
im = np.array(Image.open('data/test/no/122.jpg'))
im2 = np.zeros(im.shape)
im3 = np.zeros(im.shape)
for i in range(3):
im2[:,:,i] = filters.gaussian_filter(im[:,:,i],3)
im3[:,:,i] = filters.gaussian_filter(im[:,:,i],5)
im2 = np.uint8(im2)
# color
im3 = np.uint8(im3)
fig = plt.figure(figsize=(15, 15))
plt.subplot(1, 3, 1)
plt.axis('off')
plt.imshow(im)
plt.title('original')
plt.subplot(1, 3, 2)
plt.axis('off')
plt.imshow(im2)
plt.title('gaussian(kernel 3)')
plt.subplot(1, 3, 3)
plt.axis('off')
plt.imshow(im3)
plt.title('gaussian(kernel 5)')
plt.show()