【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)

滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)

  • 滤镜
  • scipy处理图片
    • 移动坐标:ndimage.shift
    • 旋转图片:rotate
    • 缩放图片:zoom
    • 切割图片:切片
  • 过滤 (降噪)
    • 添加噪点:
    • 降噪(三种)
      • 高斯滤波:ndimage.gaussian_filter()
      • 中值滤波:ndimage.median_filter()
      • 维纳滤波: wiener()

滤镜

导包:

from PIL import Image, ImageFilter

读取图片

cat = Image.open('../data/cat.jpg')
cat

各种滤镜效果
- 全大写的才是滤镜

# blur 模糊, contour轮廓, detail 细节增加 edge_enhance边缘强化, emboss浮雕, find_edges找到边缘, sharpen锐化, Smooth柔化
cat.filter(ImageFilter.BLUR)

【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第1张图片

scipy处理图片

  • 使用 scipy 中的小浣熊(misc)图片为例
  • 使用ndimage移动坐标、旋转图片、切割图片、缩放图片

导包:

from scipy import misc
from scipy import ndimage

读取小浣熊的正脸照

face = misc.face()
face

【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第2张图片
展示图片

plt.figure(figsize=(10,8))
plt.imshow(face)

使用ndimage移动坐标、旋转图片、切割图片、缩放图片

移动坐标:ndimage.shift

# mode : {'reflect'反射, 'constant', 'nearest', 'mirror', 'wrap'}
face_shift = ndimage.shift(face, shift=(-200, -300, 0), mode='constant')
plt.figure(figsize=(10,8))
plt.imshow(face_shift)

【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第3张图片
不同的mode会将移出区域的黑色用不同效果填充

旋转图片:rotate

face_rotate = ndimage.rotate(face, angle=60)
plt.figure(figsize=(10,8))
plt.imshow(face_rotate)

【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第4张图片

缩放图片:zoom

注意: 彩色图片一定要记得不要对颜色进行缩放.

face_zoom = ndimage.zoom(face, zoom=(0.6, 0.7, 1))
plt.figure(figsize=(10,8))
plt.imshow(face_zoom)

【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第5张图片

切割图片:切片

face_cut = face[280:490, 500:800]
plt.figure(figsize=(10,8))
plt.imshow(face_cut)

【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第6张图片

过滤 (降噪)

步骤:

  • 先获取一张黑白图片(二位)
  • 再对其人为添加噪点
  • 分别使用ndimage中的高斯滤波、中值滤波、signal中维纳滤波进行处理

获取一张黑白图 (gray=True)

face = misc.face(gray=True)
plt.figure(figsize=(10,8))
plt.imshow(face, cmap='gray')


查看形状,是一个二维数据
在这里插入图片描述
查看数据,每个值都是0~255之间的数

face

【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第7张图片
查看数据的标准偏差

face.std()

在这里插入图片描述

添加噪点:

  1. 先拷贝一份数据,并转换成浮点型

     face_noise = face.copy().astype(np.float64)
    
  2. 每个点的数值都加一个标准正太分布: += np.random.randn(768,1024) ,因为标准正太分布范围在-3~3之间,而face.std()是54,所以要把数值加大一点,噪点才明显一点。于是再乘以标准偏差的一半:* face.std() * 0.5

     face_noise += np.random.randn(768,1024) * face.std() * 0.5
    
  3. 显示加了噪点后的图片

     plt.figure(figsize=(10,8))
     plt.imshow(face_noise, cmap='gray')
    

降噪(三种)

高斯滤波:ndimage.gaussian_filter()

  • sigma:高斯(合适的)标准偏差
    高斯的原理是把每一个噪点圈起来,在圈的范围内取平均值,sigma越小,圈越小,sigma的值不能太大(丢失细节,模糊),也不能太小(噪点还是很大),要自己尝试取值。
    【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第8张图片

  • 使用函数ndimage.gaussian_filter()
    多次尝试后发现sigma取1效果最好

      face_gaussian = ndimage.gaussian_filter(face_noise, sigma=1)
      plt.figure(figsize=(10,8))
      plt.imshow(face_gaussian, cmap='gray')
    

中值滤波:ndimage.median_filter()

  • 原理:在一个点的周围取一圈数据,放进一个列表中,再取列表的中间值(中位数)
    【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第9张图片

  • 参数size就是列表的大小
    1就是它自己,5就是周围取5个值放到列表中,再取列表中位数

      face_median = ndimage.median_filter(face_noise, size=5)
      plt.figure(figsize=(10,8))
      plt.imshow(face_median, cmap='gray')
    

【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第10张图片

维纳滤波: wiener()

  • 原理:就是PS里的修图

  • scipy.signal包中的wiener

      from scipy.signal import wiener
      
      face_wiener = wiener(face_noise, mysize=5)
      plt.figure(figsize=(10,8))
      plt.imshow(face_wiener, cmap='gray')
    

    【数据分析day05】滤镜 & scipy处理图片(含三种降噪:高斯滤波,中值滤波,维纳滤波)_第11张图片

你可能感兴趣的:(数据分析)