JPEG
压缩技术串讲全章知识点。人工智能是引领未来发展的战略性技术,是新一轮科技革命和产业变革的重要驱动力量,将深刻地改变人类社会生活。
促进人工智能和实体经济的深度融合,构建数据驱动、人机协同、跨界融合、共创分享的智能经济形态,更是推动质量变革、效率变革、动力变革的重要途经。
进年来,我国人工智能新技术、新产品、新业态持续涌现,与农业、制造业、服务业等行业的融合步伐明显加快,在技术创新、应用推广、产业发展等方面成效初显。
人工智能技术并不是一个新生事物,它在最近几年引起全球性关注并得到飞速发展的主要原因,在于它的三个基本要素(算法、数据、算力)的迅猛发展,其中又以数据和算力的发展尤为重要。
物联网技术的蓬勃发展使得数据累计的难度越来越低,而芯片算力的不断提升,使得过去只能通过云计算才能完成的人工智能运算,现在可以下沉到最普通的设备上完成。
物联网技术为机器带来感知能力,而人工智能则通过计算算力为机器带来了决策能力,正如感知和大脑对自然生命进化所起到的必然性作用。
https://hulin.blog.csdn.net/article/details/107570020
https://hulin.blog.csdn.net/article/details/107578369
https://hulin.blog.csdn.net/article/details/107589248
《热分析理论》
中指出:任何周期函数都可以分解为不同频率的正弦或余弦级数的形式,即傅里叶级数。该方法从本质上完成了空间信息到频域信息的变换,通过变换将空间域信号处理问题转换成频域信号处理问题。f(x)
满足狄力克雷条件(在周期内存在有限个间断点)、有限极值条件、绝对可积条件,只有满足这3个条件,函数的傅里叶变换才是存在的。from matplotlib import pyplot as plt
import numpy as np
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
def show(ori_func, sampling_period=5):
n = len(ori_func)
interval = sampling_period / n
# 绘制原始函数
plt.subplot(2, 1, 1)
plt.plot(np.arange(0, sampling_period, interval), ori_func, 'black')
plt.xlabel('时间'), plt.ylabel('振幅')
plt.title('原始信号')
# 绘制变换后的函数
plt.subplot(2, 1, 2)
frequency = np.arange(n / 2) / (n * interval)
nfft = abs(ft[range(int(n / 2))] / n)
plt.plot(frequency, nfft, 'red')
plt.xlabel('频率(Hz)'), plt.ylabel('频谱')
plt.title('傅里叶变换')
plt.show()
# 生成频率为1,角速度为2*pi的正弦波
time = np.arange(0, 5, .005)
x = np.sin(2 * np.pi * 1 * time)
y = np.fft.fft(x)
show(x, y)
from matplotlib import pyplot as plt
import numpy as np
from skimage import data
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
img = data.camera()
# 快速傅里叶变换得到频率分布
f = np.fft.fft2(img)
# 默认结果中心点的位置是左上角,转移到中间位置
fshift = np.fft.fftshift(f)
# fft结果是复数,求绝对值结果才是振幅
fimg = np.log(np.abs(fshift))
# 展示结果
plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('原始图像')
plt.subplot(1, 2, 2), plt.imshow(fimg, 'gray'), plt.title('傅里叶频谱')
plt.show()
① 线性特性。
傅里叶变换的线性特性可以表示为:若f1(t)↔F1(Ω)
,f2(t)↔F2(Ω)
,则 af1(t)+bf2(t)↔aF1(Ω)+bF2(Ω)
。其中a
、b
为任意常数,利用傅里叶变换的线性特性,可以将待求信号分解为若干基本信号之和。
② 时延特性。
时延(移位)特性说明波形在时间轴上时延,并不会改变信号幅度,仅使信号增加-Ωt0
线性相位。
③ 频移特性。
频移(调制)特性表明信号在时域中与复因子相乘,则在频域中将使整个频谱搬移Ω0
。
④ 尺度变换。
尺度特性说明,信号在时域中压缩,在频域中扩展;反之,信号在时域中扩展,在频域中就一定压缩,即信号的脉宽与频宽成反比。一般来说,时宽有限的信号,其频宽无限,反之亦然。
相较于一维傅里叶变换,二维傅里叶变换还具有可分离性,平移特性,旋转特性等。
① 可分离性。
二维离散傅里叶变换(DFT),可视为由沿着x、y方向的两个一维傅里叶变换所构成。这一性质可有效降低二维傅里叶变换的计算复杂性。
from matplotlib import pyplot as plt
import numpy as np
from skimage import data, color
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
img_rgb = data.coffee()
img = color.rgb2gray(img_rgb)
# 在X方向实现傅里叶变换
m, n = img.shape
fx = img
for x in range(n):
fx[:, x] = np.fft.fft(img[:, x])
for y in range(m):
fx[y, :] = np.fft.fft(img[y, :])
# 默认结果中心点位于左上角,转移到中间位置
fshift = np.fft.fftshift(fx)
# fft结果是复数,求绝对值结果才是振幅
fimg = np.log(np.abs(fshift))
# 展示结果
plt.subplot(121), plt.imshow(img_rgb, 'gray'), plt.title('原始图像')
plt.subplot(122), plt.imshow(fimg, 'gray'), plt.title('两次一维傅里叶变换的图像')
plt.show()
② 平移特性。
f(x,y)
在空间平移了,相当于把傅里叶变换与一个指数相乘。f(x,y)
在空间与一个指数项相乘,相当于平移其傅里叶变换。
③ 旋转特性。
对f(x,y)
旋转一定角度,相当于将其傅里叶变换F(u,v)
旋转一定角度。
4*M*M
的运算量就降低到2*M*M
的运算量了。f(x,y)
经傅里叶变换为F(u,v)
,频域增强就是选择合适的滤波器函数H(u,v)
对F(u,v)
的频谱成分进行调整,然后经傅里叶逆变换得到增强的图像g(x,y)
H(u,v)
突出f(x,y)某方面的特征,从而得到需要的图像g(x,y)
.例如,利用传递函数突出高频分量,以增强图像的边缘信息,即高通滤波。如果突出低频分量,就可以使图像显得比较平滑,即低通滤波。f(x,y)
进行傅里叶变换得到F(u,v)
F(u,v)
与传递函数H(u,v)
进行卷积运算得到G(u,v)
G(u,v)
进行傅里叶逆变换得到增强图像g(x,y)
from matplotlib import pyplot as plt
import numpy as np
from skimage import data, color
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
D = 10
new_img = data.coffee()
new_img = color.rgb2gray(new_img)
# 傅里叶变换
f1 = np.fft.fft2(new_img)
# 使用np.fft.fftshift()函数实现平移,让直流分量输出图像的重心
f1_shift = np.fft.fftshift(f1)
# 实现理想低通滤波器
rows, cols = new_img.shape
crow, ccol = int(rows / 2), int(cols / 2) # 计算频谱中心
mask = np.zeros((rows, cols), dtype='uint8') # 生成rows行,从cols列的矩阵,数据格式为uint8
# 将距离频谱中心距离小于D的低通信息部分设置为1,属于低通滤波
for i in range(rows):
for j in range(cols):
if np.sqrt(i * i + j * j) <= D:
mask[crow - D:crow + D, ccol - D:ccol + D] = 1
f1_shift = f1_shift * mask
# 傅里叶逆变换
f_ishift = np.fft.ifftshift(f1_shift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
img_back = (img_back - np.amin(img_back)) / (np.amax(img_back) - np.amin(img_back))
plt.figure()
plt.subplot(121)
plt.imshow(new_img, cmap='gray')
plt.title('原始图像')
plt.subplot(122)
plt.imshow(img_back, cmap='gray')
plt.title('滤波后的图像')
plt.show()
D0
为截止频率,n
为函数的阶。一般取使H(u,v)
最大值下降到最大值的一半时的D(u,v)
为截止频率D0
。from matplotlib import pyplot as plt
import numpy as np
from skimage import data, color
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
img = data.coffee()
img = color.rgb2gray(img)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 取绝对值后将复数变化为实数
# 取对数的目的是将数据变换到0~255
s1 = np.log(np.abs(fshift))
def ButterworthPassFilter(image, d, n):
"""
Butterworth低通滤波器
"""
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transform_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))
for i in range(transform_matrix.shape[0]):
for j in range(transform_matrix.shape[1]):
def cal_distance(pa, pb):
from math import sqrt
dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
return dis
dis = cal_distance(center_point, (i, j))
transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))
return transform_matrix
d_matrix = make_transform_matrix(d)
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))
return new_img
plt.subplot(221)
plt.axis('off')
plt.title('Original')
plt.imshow(img, cmap='gray')
plt.subplot(222)
plt.axis('off')
plt.title('Butter D=100 n=1')
butter_100_1 = ButterworthPassFilter(img, 100, 1)
plt.imshow(butter_100_1, cmap='gray')
plt.subplot(223)
plt.axis('off')
plt.title('Butter D=30 n=1')
butter_30_1 = ButterworthPassFilter(img, 30, 1)
plt.imshow(butter_30_1, cmap='gray')
plt.subplot(224)
plt.axis('off')
plt.title('Butter D=30 n=5')
butter_30_5 = ButterworthPassFilter(img, 30, 5)
plt.imshow(butter_30_5, cmap='gray')
plt.show()
from matplotlib import pyplot as plt
import numpy as np
from skimage import data, color
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
D = 10
new_img = data.coffee()
new_img = color.rgb2gray(new_img)
# numpy 中的傅里叶变换
f1 = np.fft.fft2(new_img)
f1_shift = np.fft.fftshift(f1)
"""
实现理想高通滤波器 start
"""
rows, cols = new_img.shape
# 计算频谱中心
crow, ccol = int(rows / 2), int(cols / 2)
# 生成rows,cols列的矩阵,数据格式为uint8
mask = np.zeros((rows, cols), dtype='uint8')
# 将距离频谱中心距离小于D的低通信息部分设置为1,属于低通滤波
for i in range(rows):
for j in range(cols):
if np.sqrt(i * i + j * j) <= D:
mask[crow - D:crow + D, ccol - D:ccol + D] = 1
mask = 1 - mask
f1_shift = f1_shift * mask
"""
实现理想高通滤波器 end
"""
# 傅里叶逆变换
f_ishift = np.fft.ifftshift(f1_shift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
img_back = (img_back - np.amin(img_back)) / (np.amax(img_back) - np.amin(img_back))
plt.figure()
plt.subplot(121)
plt.axis('off')
plt.imshow(new_img, cmap='gray')
plt.title('原始图像')
plt.subplot(122)
plt.axis('off')
plt.imshow(img_back, cmap='gray')
plt.title('过滤后的图像')
plt.show()
from matplotlib import pyplot as plt
import numpy as np
from skimage import data, color
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
img = data.coffee()
img = color.rgb2gray(img)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 取绝对值后将复数变化为实数
# 取对数的目的是将数据变换到0~255
s1 = np.log(np.abs(fshift))
def ButterworthPassFilter(image, d, n):
"""
Butterworth 高通滤波器
"""
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transform_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))
for i in range(transform_matrix.shape[0]):
for j in range(transform_matrix.shape[1]):
def cal_distance(pa, pb):
from math import sqrt
dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
return dis
dis = cal_distance(center_point, (i, j))
transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))
return transform_matrix
d_matrix = make_transform_matrix(d)
d_matrix = 1 - d_matrix
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))
return new_img
plt.subplot(221)
plt.axis('off')
plt.title('Original')
plt.imshow(img, cmap='gray')
plt.subplot(222)
plt.axis('off')
plt.title('Butter D=100 n=1')
butter_100_1 = ButterworthPassFilter(img, 100, 1)
plt.imshow(butter_100_1, cmap='gray')
plt.subplot(223)
plt.axis('off')
plt.title('Butter D=30 n=1')
butter_30_1 = ButterworthPassFilter(img, 30, 1)
plt.imshow(butter_30_1, cmap='gray')
plt.subplot(224)
plt.axis('off')
plt.title('Butter D=30 n=5')
butter_30_5 = ButterworthPassFilter(img, 30, 5)
plt.imshow(butter_30_5, cmap='gray')
plt.show()
He(u,v)
=k*H(u,v)
+c
from matplotlib import pyplot as plt
import numpy as np
from skimage import data, color
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
img = data.coffee()
img = color.rgb2gray(img)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 取绝对值后将复数变化为实数
# 取对数的目的是将数据变换到0~255
s1 = np.log(np.abs(fshift))
def ButterworthPassFilter(image, d, n):
"""
Butterworth 高通滤波器
"""
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transform_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))
for i in range(transform_matrix.shape[0]):
for j in range(transform_matrix.shape[1]):
def cal_distance(pa, pb):
from math import sqrt
dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
return dis
dis = cal_distance(center_point, (i, j))
transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))
return transform_matrix
d_matrix = make_transform_matrix(d)
d_matrix = d_matrix+0.5
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))
return new_img
plt.subplot(221)
plt.axis('off')
plt.title('Original')
plt.imshow(img, cmap='gray')
plt.subplot(222)
plt.axis('off')
plt.title('Butter D=100 n=1')
butter_100_1 = ButterworthPassFilter(img, 100, 1)
plt.imshow(butter_100_1, cmap='gray')
plt.subplot(223)
plt.axis('off')
plt.title('Butter D=30 n=1')
butter_30_1 = ButterworthPassFilter(img, 30, 1)
plt.imshow(butter_30_1, cmap='gray')
plt.subplot(224)
plt.axis('off')
plt.title('Butter D=30 n=5')
butter_30_5 = ButterworthPassFilter(img, 30, 5)
plt.imshow(butter_30_5, cmap='gray')
plt.show()