当一幅rgb图像每一个点的三个彩色分量的值都相等,即R=G=B。我们就可以用其中一维来表示这个图片,因为三个分量都相等。这一个过程就叫做“灰度化”,灰度化以后得到的图片矩阵会从3维降至2维,这张图片看起来也是黑白的。
Numpy是非常有名的Python科学计算工具包,其中包含了大量有用的思想,比如数组对象(用来表示向量、矩阵、图像等)以及线性代数函数。
Numpy中的数组对象几乎贯穿用于基本图像变换的所有例子中。数组对象可以帮助实现数组中的重要操作,比如矩阵乘积、转置、解方程系统、向量乘积和归一化,为图像变形、对变化进行建模、图像分类、图像聚类等提供了基础。
在python基本图像操作中,当载入图像时,通过调用 array() 方法将图像转换成Numpy的数组对象。Numpy 中的数组对象是多维的,可以用来表示向量、矩阵和图像。通过对图像的数组进行直接操作,就可以完成很多图像处理。
安装numpy包:首先进入网站 https://pypi.org/
输入要查找的包numpy
选择Download File
根据电脑是32位还是64位选择下载
下载完成后保存至根目录,打开cmd,输入pip install numpy
numpy包安装完成
将图像转换为灰度可以使用平均值法:Gray=(R+G+B)/3;
通过求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),再用它替换原来的RGB(R,G,B)就是灰度图像了。这种方法产生的灰度图像比较柔和。
可以通过使用python的语句convert(‘L’)来获得灰度图
from PIL import Image
from pylab import *
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()
pil_im = Image.open('11.jpg')
gray()
subplot(121)
title(u'原图',fontproperties=font)
axis('off')
imshow(pil_im)
pil_im = Image.open('11.jpg').convert('L')
subplot(122)
title(u'灰度图',fontproperties=font)
axis('off')
imshow(pil_im)
show()
对于一副灰度图像img,它的每一个像素点img(x,y)都有一个灰度值,可能的灰度取值有2^8=256个(0,1,…,255)。如果统计出灰度值r在img中出现的次数n,并对其进行归一化(n/N,N是所有灰度值出现次数的总和),这样就可以得到像素r在img中出现的概率p®。如果对每一个可能的灰度取值r都做同样的处理,我们可以得到如图1左侧所示的概率分布曲线,该曲线就是我们常说的直方图。
图1 直方图均衡化目标
from PIL import Image
from pylab import *
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('11.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,11000])
show()
直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在读图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增加图像的对比度。
基本思想:把原始图的直方图变换为均匀分 布的形式,这样就增加了像素灰度值的动态 范围,从而达到增强图像整体对比度的效果
使用的方法是灰度级变换:s = T®
原理:
s=T® 0≤r≤1
T®满足下列两个条件:
(1)T®在区间0≤r≤1中为单值且单调递增
(2)当0≤r≤1时,0≤T® ≤1
条件(1)保证原图各灰度级在变换后仍保持从黑 到白(或从白到黑)的排列次序
条件(2)保证变换前后灰度值动态范围的一致性
Pr®是r的概率密度函数,Ps(s)是s的概 率密度函数,Pr®和T®已知,且T-1(s) 满足上述条件(1),所以有
已知一种变换函数:
关于上限的定积分的导数就是该上限的积分值 (莱布尼茨准则)
对于离散值:
其中rk 是第k个灰度级,k = 0,1,2,…,L-1.
nk是图像中灰度级为rk的像素个数.
n是图像中像素的总数.
已知变换函数的离散形式为:
sk称作直方图均衡化 将输入图像中灰度级为rk(横坐标)的像素映射 到输出图像中灰度级为sk (横坐标)的对应像素得到.
在实现直方图均衡化中,使用到四个工具包分别是:PIL,matplotlib,pylab,PVC。下面将一一介绍安装过程
PIL和matplotlib的安装过程和安装numpy过程一样,打开网址直接查找安装就可以了
1.pylab 模块是一款由python提供的可以绘制二维,三维数据的工具模块
2.由于pylab是matplotlib中的一部分,所以直接下载matplotlib库就可以了
1.下载PCV库文件数据,下载地址:https://github.com/jesolem/PCV
2.将下载的文件解压至:C:\PCV
3.打开cmd,执行如下指令:
(1)cd C:\PCV
(2)python setup.py install
4.安装成功
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('11.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, normed=True)
subplot(2, 2, 4)
axis('off')
title(u'均衡化后的直方图', fontproperties=font)
hist(im2.flatten(), 128, normed=True)
show()
高斯模糊本质上是低通滤波器,输出图像的每个像素点是原图像上对应像素点与周围像素点的加权和,原理并不复杂。做久了卷积神经网络看这个分外亲切,就是用高斯分布权值矩阵与原始图像矩阵做卷积运算而已。
SciPy是一个开源的数学工具包,它是建立在NumPy的基础上的。它提供了很多有效的常规操作,包括数值综合、最优化、统计、信号处理以及图像处理。正如接下来所展示的,SciPy库包含了很多有用的模块
scipy的安装过程和安装numpy过程一样,打开网址直接查找安装就可以了
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('11.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)
show()
可以看出,高斯矩阵的尺寸越大,标准差越大,处理过的图像模糊程度越大。
高斯滤波是线性滤波中的一种。在OpenCV图像滤波处理中,高斯滤波用于平滑图像,或者说是图像模糊处理,因此高斯滤波是低通的。其广泛的应用在图像处理的减噪过程中,尤其是被高斯噪声所污染的图像上。
高斯滤波的基本思想是: 图像上的每一个像素点的值,都由其本身和邻域内其他像素点的值经过加权平均后得到。
其具体操作是,用一个核(又称为卷积核、掩模、矩阵)扫描图像中每一个像素点,将邻域内各个像素值与对应位置的权值相称并求和。从数学的角度来看,高斯滤波的过程是图像与高斯正态分布做卷积操作。
注意:高斯滤波是将二维高斯正态分布放在图像矩阵上做卷积运算。考虑的是邻域内像素值的空间距离关系,因此对彩色图像处理时应分通道进行操作,也就是说操作的图像原矩阵时用单通道数据,最后合并为彩色图像。
import cv2
import numpy as np
img = cv2.imread("11.jpg", cv2.IMREAD_UNCHANGED)
rows, cols, chn = img.shape
a = img.shape
for i in range(5000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
img[x, y, :] = 255
img = cv2.resize(img,(int(a[1]/3),int(a[0]/3)),interpolation=cv2.INTER_AREA)
cv2.imshow("noise", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这张图片不是很明显
局部图