当前位置:   article > 正文

数据分析与AI(七)傅里叶对登月图片降噪/scipy库对图片进行处理/_傅里叶的图像去噪

傅里叶的图像去噪

登月图片消噪

scipy.fftpack模块用来计算快速傅里叶变换

速度比传统傅里叶变换更快,是对之前算法的改进

黑白图片是二维数据,注意使用fftpack的二维转变方法

import numpy as np

# 这是scipy中的傅里叶变换
from scipy.fftpack import fft2, ifft2
import matplotlib.pyplot as plt


# PIL也是处理图片的
from PIL import Image
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
# png 最大范围 0 - 1
moon = plt.imread('./moonlanding.png')
moon
# 结果如下:
  • 1
  • 2
  • 3
  • 4

这里写图片描述

plt.imshow(moon,cmap='gray')
# 结果如下:
  • 1
  • 2

这里写图片描述

# 进行傅里叶变换
# 傅里叶变化是把时域变为频域
moon_fft2 = fft2(moon)
moon_fft2
  • 1
  • 2
  • 3
  • 4

这里写图片描述

# 先求一个绝对值, 为什么, 因为有白圆环和黑圆环, 谁正谁负并不清楚
# 1e3 代表1000
cond = np.abs(moon_fft2) > 1e3
moon_fft2[cond] = 0
  • 1
  • 2
  • 3
  • 4
# 再把频域转变为时域
# ifft2
moon_ifft2 = ifft2(moon_fft2)
moon_ifft2
  • 1
  • 2
  • 3
  • 4

这里写图片描述

# 去除复数
res = np.real(moon_ifft2)
# 显示图片
plt.figure(figsize=(12,9))
plt.imshow(res,cmap='gray')
  • 1
  • 2
  • 3
  • 4
  • 5

这里写图片描述

scipy

scipy是基于numpy的

import numpy as np

import matplotlib.pyplot as plt

# MCM
  • 1
  • 2
  • 3
  • 4
  • 5

数值积分,求圆周率

# 祖率: 3.1415926 - 927
# 计算机通过积分的方式来画圆
# x^2 + y^2  = r^2

# f(x) = (r^2 - x^2)^0.5

# 假设圆的半径我们知道, r = 1
X = np.linspace(-1,1,1000)

f = (1 - X**2)**0.5

# 计算三角形, 以0点计算, 计算对边
# 我们画圆形需要x和y
plt.figure(figsize=(4,4))
# 有了三角形, 圆形的斜边顶点就找到了, 把这2000个顶点给连接起来就使用一个圆形
plt.plot(X, f)
plt.plot(X, -f)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里写图片描述
使用scipy.integrate进行积分,调用quad()方法,求圆周率

# integrate 在数学上用作积分运算
import scipy.integrate as integrate
import scipy

f = lambda x : (1-x**2)**0.5
# quad中第一个参数是一个func, y轴的解,a和b代表x轴的范围, 分别填入-1,1
pi, error = integrate.quad(f,-1,1)

# (1.5707963267948986, 1.0002356720661965e-09)
#  第一个数是圆周率, 第二个数是误差
print('通过积分求解的圆周率:%s, 误差为:%s' % (pi*2, error*2))
# 结果是:
# 通过积分求解的圆周率:3.141592653589797, 误差为:2.000471344132393e-09
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

scripy中的文件输入和输出

# io
import scipy.io as io
from scipy.fftpack import fft2, ifft2
  • 1
  • 2
  • 3
moon = plt.imread('./moonlanding.png')
moon_fft2 = fft2(moon)
cond = np.abs(moon_fft2) > 1e3
moon_fft2[cond] = 0
moon_ifft2 = ifft2(moon_fft2)
res = np.real(moon_ifft2)
plt.figure(figsize=(12,9))
plt.imshow(res,cmap='gray')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里写图片描述

#.mat 这是一种数据格式
# math matrix
# matlib 通用字典
# 文件存储都是以二进制
io.savemat('./moon_clear.mat',{'moon':res})
# load
io.loadmat('./moon_clear.mat')['moon']
# 结果是:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
array([[-0.2826645 ,  0.08010893, -0.21303105, ..., -0.03895291,
    -0.18217105, -0.17954478],
   [-0.00702763,  0.06715892, -0.09148968, ..., -0.1856927 ,
    -0.19348538, -0.15636131],
   [-0.03724453, -0.12469123, -0.10263439, ..., -0.18584874,
    -0.19098356,  0.08034539],
   ...,
   [ 0.07167082, -0.04644684, -0.07860907, ...,  0.09754767,
     0.02351329,  0.18534262],
   [ 0.00943622, -0.06645724, -0.02696014, ...,  0.05524265,
    -0.00268553,  0.19484597],
   [-0.0551862 ,  0.03641299, -0.06190041, ...,  0.03356535,
     0.02719305, -0.02497441]], dtype=float32)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

读写图片使用scipy中misc.imread()/imsave()

# misc 表示是一个库非常的杂乱无章
import scipy.misc as misc
  • 1
  • 2
# 利用这个库读出来以后做了一个变换把PNG转变昵称了JPG
moon = misc.imread('./moonlanding.png')
plt.figure(figsize=(12,9))
plt.imshow(moon, cmap='gray')
# 结果如下:
  • 1
  • 2
  • 3
  • 4
  • 5

这里写图片描述
imrotate、imresize、imfilter 旋转, 改变大小, 滤波

# 旋转
plt.imshow(misc.imrotate(moon, 60),cmap='gray')
# 结果是:
  • 1
  • 2
  • 3

这里写图片描述

# imresize     int 0.5 = 50%缩小
plt.imshow(misc.imresize(moon,0.5),cmap='gray')
  • 1
  • 2

这里写图片描述

# tuple(100, 200) 是压缩成Y为100, X为200的图片
plt.imshow(misc.imresize(moon,(100, 200)),cmap='gray')
  • 1
  • 2

这里写图片描述

imfilter图片过滤

The filter that has to be applied , Legal values are:
‘blur’, ‘contour’, ‘detail’, ‘edge_enhance’, ‘edge_enhance_more’,
‘emboss’, ‘find_edges’, ‘smooth’, ‘smooth_more’, ‘sharpen’.

必须应用的筛选器, 法律价值是:
‘模糊’, ‘轮廓’, ‘细节’, ‘EdgEl增强’, ‘EdgEI增强’
‘浮雕’,’发现边缘’,’平滑’,’平滑多’, ‘锐化’

# 这是一张模糊的图片
cat = plt.imread('./cat.jpg')
plt.imshow(misc.imfilter(cat, 'blur'))
  • 1
  • 2
  • 3

这里写图片描述

# 轮廓图
plt.imshow(misc.imfilter(cat, 'contour'))
  • 1
  • 2

这里写图片描述

# sharpen
plt.figure(figsize=(12,9))
plt.imshow(misc.imfilter(cat, 'sharpen'))
  • 1
  • 2
  • 3

这里写图片描述

图片处理

使用scipy.misc.face(gray=True)获取图片,

使用ndimage移动坐标、旋转图片、切割图片、缩放图片导包,读取图片显示图片

import scipy.ndimage as ndimage
  • 1
# 在ndimage中, scipy给我们提供了一张图片, misc.face()
face = misc.face(gray = True)
plt.imshow(face, cmap='gray')
  • 1
  • 2
  • 3

这里写图片描述

shift移动坐标

# input 代表将要被处理的图片
# 第二个参数代表你要移动多少
plt.imshow(ndimage.shift(face, [-100, 200], mode=), cmap='gray')
  • 1
  • 2
  • 3

这里写图片描述

# mode : 'constant', 'nearest', 'reflect', 'mirror' or 'wrap
plt.imshow(ndimage.shift(face, [-100, 200], mode='mirror'), cmap='gray')
  • 1
  • 2

这里写图片描述

zoom#缩放图片

# resize imresize
plt.imshow(ndimage.zoom(face, 0.5), cmap='gray')
  • 1
  • 2

这里写图片描述

# sequence 序列中的值只能是浮点型, 分别代表对y轴和x轴进行缩放
plt.imshow(ndimage.zoom(face, [0.3,0.8]), cmap='gray')
  • 1
  • 2

这里写图片描述

切割图片

plt.imshow(face, cmap='gray')
  • 1

这里写图片描述

plt.imshow(face[:500,400:950],cmap='gray')
  • 1

这里写图片描述

如果是彩色的图片怎么办了

face1 = misc.face()
face1.shape
  • 1
  • 2
plt.imshow(face1)
  • 1

这里写图片描述

#plt.imshow(ndimage.shift(face1, [100, 200]), 彩色图片是三维的, 少写一维会报错
plt.imshow(ndimage.shift(face1, [100, 200, -2]))
# rgb -> rrg
#(100,200,300) -> (100,100,200) -> (100,100,100) ->(300,100,100) 
  • 1
  • 2
  • 3
  • 4

这里写图片描述

plt.imshow(ndimage.shift(face1, [100, 200, 1], mode='mirror'))
  • 1

这里写图片描述

# 注意的是颜色的滚动
plt.imshow(ndimage.shift(face1, [100, 200, 4], mode='mirror'))
  • 1
  • 2

这里写图片描述

# zoom 进行压缩
plt.imshow(ndimage.zoom(face1,[0.5,0.5, 1]), cmap='gray')
  • 1
  • 2

这里写图片描述

图片进行过滤

添加噪声,对噪声图片使用ndimage中的高斯滤波、中值滤波、signal中维纳滤波进行处理,使图片变清楚

使用了misc.face()的灰色照片添加噪声

face_blur = face + np.random.randn(face_blur.shape[0], face_blur.shape[1])*face.std()
plt.imshow(face_blur, cmap='gray')
  • 1
  • 2

这里写图片描述
高斯滤波sigma:高斯和的标准偏差

# sigma频率
# 频率怎么取值
# plt.subplot(1, 3, 1) subplot中的值代表 1行 显示3张图片  当前是编号1
plt.figure(figsize=(12,9))

axes = plt.subplot(1, 3, 1)
axes.imshow(ndimage.gaussian_filter(face_blur, sigma=2), cmap='gray')

axes1 = plt.subplot(132)
axes1.imshow(ndimage.gaussian_filter(face_blur, sigma=0), cmap='gray')

axes2 = plt.subplot(133)
axes2.imshow(ndimage.gaussian_filter(face, sigma=0), cmap='gray')

# 可以用来还原照片
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这里写图片描述
将登月图片进行高斯过滤

moon = plt.imread('./moonlanding.png')
plt.imshow(ndimage.gaussian_filter(moon,sigma=2), cmap='gray')
  • 1
  • 2

这里写图片描述
中值滤波参数size:给出在每个元素上从输入数组中取出的形状位置,定义过滤器功能的输入

plt.figure(figsize=(12,9))

axes = plt.subplot(1, 3, 1)
axes.imshow(ndimage.median_filter(face_blur, size=6), cmap='gray')

axes1 = plt.subplot(132)
axes1.imshow(face_blur, cmap='gray')

axes2 = plt.subplot(133)
axes2.imshow(face, cmap='gray')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里写图片描述
signal维纳滤波mysize:滤镜尺寸的标量

import scipy.signal as signal

plt.figure(figsize=(12,9))

axes = plt.subplot(1, 3, 1)
axes.imshow(signal.wiener(face_blur, mysize=10), cmap='gray')

axes1 = plt.subplot(132)
axes1.imshow(face_blur, cmap='gray')

axes2 = plt.subplot(133)
axes2.imshow(face, cmap='gray')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里写图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号