一张图片是由像素点矩阵构成,我们对图片进行操作即为对图片的像素点矩阵进行操作。我们只要在这个像素点矩阵中找到这个像素点的位置,比如第x行,第y列,所以这个像素点在这个像素点矩阵中的位置就可以表示成(x,y),因为一个像素点的颜色由红、绿、蓝三个颜色变量表示(R,G,B),所以我们通过给这三个变量赋值,来改变这个像素点的颜色。
图片的灰度化:将一个像素点的三个颜色变量相等,R=G=B,此时该值称为灰度值,直接调用opencv中的函数
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import * # pylab库画图功能
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()
pil_im = Image.open('C:/Users/asus/Pictures/window/tiger.jpg') # 原始图像
gray()
subplot(121) # 一行两列 ,第一个图 (显示)
title(u'原图', fontproperties=font)
axis('off')
imshow(pil_im)
# 读取图像并转换为灰度图像
pil_im = Image.open('C:/Users/asus/Pictures/window/tiger.jpg').convert('L')
subplot(122)
title(u'灰度图', fontproperties=font)
axis('off')
imshow(pil_im)
show() # 屏幕显示
直方图:就是离散的概率分布图. 比如256灰度图.横轴就是像素值,从0-255,纵轴是当前像素值对应的像素个数。直方图标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此,一张较暗图片的图像直方图中的数据多集中于左侧和中间部分;而整体明亮、只有少量阴影的图像则相反。
# -*- coding: utf-8 -*-
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('C:/Users/asus/Pictures/window/tiger.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()
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
操作:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板中像素的加权平均值去替代模板中心像素点的值。
作用:相对于均值滤波它的平滑效果更柔和,而且边缘保留的也更好。
σ越大,高斯滤波器的频带就越宽,平滑程度就越好,低通(高阻)滤波的效果越明显。高斯滤波被用作为平滑滤波器的本质原因是因为它是一个低通滤波器。要对数字图像做高斯模糊,就是用一个符合高斯函数分布的卷积核对数字图像做卷积运算。
# -*- 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('C:/Users/asus/Pictures/window/tiger.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()
# -*- coding: utf-8 -*-
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('C:/Users/asus/Pictures/window/tiger.jpg')
print(pil_im.mode, pil_im.size, pil_im.format)
subplot(231)
title(u'原图', fontproperties=font)
axis('off')
imshow(pil_im)
# 显示灰度图
pil_im = Image.open('C:/Users/asus/Pictures/window/tiger.jpg').convert('L')
gray()
subplot(232)
title(u'灰度图', fontproperties=font)
axis('off')
imshow(pil_im)
# 拷贝粘贴区域
pil_im = Image.open('C:/Users/asus/Pictures/window/tiger.jpg')
box = (100,100,400,400)
region = pil_im.crop(box)
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)
subplot(233)
title(u'拷贝粘贴区域', fontproperties=font)
axis('off')
imshow(pil_im)
# 缩略图
pil_im = Image.open('C:/Users/asus/Pictures/window/tiger.jpg')
size = 128, 128
pil_im.thumbnail(size)
print(pil_im.size)
subplot(234)
title(u'缩略图', fontproperties=font)
axis('off')
imshow(pil_im)
pil_im.save('C:/Users/asus/Pictures/window/thumbnail2.jpg') # 保存缩略图
# 调整图像尺寸
pil_im = Image.open('C:/Users/asus/Pictures/window/tiger.jpg')
pil_im = pil_im.resize(size)
print(pil_im.size)
subplot(235)
title(u'调整尺寸后的图像', fontproperties=font)
axis('off')
imshow(pil_im)
# 旋转图像45°
pil_im = Image.open('C:/Users/asus/Pictures/window/tiger.jpg')
pil_im = pil_im.rotate(45)
subplot(236)
title(u'旋转45°后的图像', fontproperties=font)
axis('off')
imshow(pil_im)
show()