理解向量的模和范数
1,向量的模和范数的计算结果都是一个实数,这个数字对应着单个向量的长度或者两个向量之间的距离。
2,在空间几何中(经常是2或3维空间),常用模来表示向量的长度或两个向量间的距离,符号为|| x ⃗ \vec{x} x||。
例子:
在二维空间中有两个向量:
x
⃗
=
(
1
,
2
)
,
y
⃗
=
(
2
,
3
)
\vec{x}=(1,2),\vec{y}=(2,3)
x=(1,2),y=(2,3),
则
x
⃗
的
长
度
为
∣
∣
x
⃗
∣
∣
=
1
2
+
2
2
\vec{x}的长度为||\vec{x}||=\sqrt{1^2+2^2}
x的长度为∣∣x∣∣=12+22,
则
x
⃗
和
y
⃗
之
间
的
距
离
为
∣
∣
x
⃗
−
y
⃗
∣
∣
=
(
1
−
2
)
2
+
(
2
−
3
)
2
\vec{x}和\vec{y}之间的距离为||\vec{x}-\vec{y}||=\sqrt{(1-2)^2+(2-3)^2}
x和y之间的距离为∣∣x−y∣∣=(1−2)2+(2−3)2。
3,在线性代数中,常用范数这个概念。对于1维空间的实数集,标准的范数就是绝对值,将绝对值的概念推广到多维空间就叫做范数。
4,范数的定义:
A norm is any function g that maps vectors to real numbers that satis es the following conditions:
1, Non-negativity: for all
x
⃗
∈
R
D
,
g
(
x
⃗
)
>
=
0
;
\vec{x} \in R^D, g(\vec{x})>=0;
x∈RD,g(x)>=0;
2, Strictly positive: for all
x
⃗
,
g
(
x
⃗
)
=
0
\vec{x}, g(\vec{x})=0
x,g(x)=0 implies that
x
⃗
=
0
\vec{x}=0
x=0;
3, Homogeneity: for all
x
⃗
\vec{x}
x and a,
g
(
a
x
⃗
)
=
∣
a
∣
g
(
x
⃗
)
,
g(a\vec{x})=|a|g(\vec{x}),
g(ax)=∣a∣g(x), where |a| is the absolute value;
4, Triangle inequality: for all
x
⃗
,
y
⃗
,
g
(
x
⃗
,
y
⃗
)
<
=
g
(
x
⃗
)
+
g
(
y
⃗
)
\vec{x}, \vec{y}, g(\vec{x}, \vec{y})<=g(\vec{x})+g(\vec{y})
x,y,g(x,y)<=g(x)+g(y).
5,ell-p norm ( ℓ p \ell_p ℓp)
这是一类特殊的范数家族,读作“little ell p 范数”。
定义如下:
Let
p
p
p be in the range
[
0
,
∞
]
[0, \infin]
[0,∞]; then the
ℓ
p
\ell_p
ℓp norm of x, denoted by
∣
∣
x
⃗
∣
∣
p
||\vec{x}||_p
∣∣x∣∣p, is de ned by:
∣ ∣ x ⃗ ∣ ∣ p = ( ∑ d = 1 D ∣ x d ∣ p ) 1 p ||\vec{x}||_p=(\sum_{d=1}^{D}|x_{d}|^p)^\frac{1}{p} ∣∣x∣∣p=(∑d=1D∣xd∣p)p1
6,由 ℓ p \ell_p ℓp范数家族衍生出来的特殊范数
1,欧式范数(Euclidean norm):
g
(
x
)
=
∑
d
=
1
D
x
d
2
g(x)=\sqrt{\sum_{d=1}^{D} x_d^2}
g(x)=∑d=1Dxd2
推荐阅读
-
比较YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P和YUV444P:理解并解析YUV420P的不同之处
-
标题:堆排序:理解大顶堆和小顶堆的作用
-
深入理解Matlab中的FFT和FFTshift
-
14-傅里叶变换的代码实现-一、numpy实现傅里叶变换和逆傅里叶变换 1.numpy实现傅里叶变换numpy.fft.fft2实现傅里叶变换,返回一个复数数组(complex ndarray),也就是频谱图像numpy.fft.fftshift将零频率分量移到频谱中心(将左上角的低频区域,移到中心位置) 20*np.log(np.abs(fshift))设置频谱的范围。可以理解为,之前通过傅里叶变换得到复数的数组,是不能通过图像的方法展示出来的,需要转换为灰度图像(映射到[0,255]区间)需要注意的是1> 傅里叶得到低频、高频信息,针对低频、高频处理能够实现不同的目的2> 傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像3> 在频域对图像进行处理,在频域的处理会反映在逆变换图像上 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) # 移动中心位置 fshift = np.fft.fftshift(f) # 调整值范围 result = 20*np.log(np.abs(fshift)) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(result,cmap=plt.cm.gray) plt.title("result") plt.axis("off") plt.show 傅里叶变换的频谱图像: 2.numpy实现逆傅里叶变换numpy.fft.ifft2实现逆傅里叶变换,返回一个复数数组(complex ndarray)numpy.fft.ifftshiftfftshift函数的逆函数,将中心位置的低频,重新移到左上角iimg = np.abs(逆傅里叶变化结果)设置值的范围,映射到[0,255]区间 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\boat.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 逆傅里叶变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("iimg") plt.axis("off") plt.show 将一副图像,进行傅里叶变换和逆傅里叶变换后,进行对比(一样的) 实例:通过numpy实现高通滤波,保留图像的边缘信息 获取图像的形状rows,cols = img.shape获取图像的中心点crow,ccol = int(rows/2),int(cols/2)将频谱图像的中心区域(低频区域)设置为0(黑色)fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\boat.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 高通滤波 rows,cols = img.shape crow,ccol = int(rows/2),int(cols/2) fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 # 逆傅里叶变换 ishift = np.fft.ifftshift(fshift) iimg = np.fft.ifft2(ishift) iimg = np.abs(iimg) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("iimg") plt.axis("off") plt.show 使用numpy实现高通滤波的实验结果: 二、opencv实现傅里叶变换和逆傅里叶变换 1.opencv实现傅里叶变换 返回结果 = cv2.dft(原始图像,转换标识)1> 返回结果:是双通道的,第一个通道是结果的实数部分,第二个通道是结果的虚数部分2> 原始图像:输入图像要首先转换成np.float32(img)格式3> 转换标识:flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列numpy.fft.fftshift将零频率分量移到频谱中心(将左上角的低频区域,移到中心位置)调整频谱的范围,将上面频谱图像的复数数组,转换为可以显示的灰度图像(映射到[0,255]区间)返回值 = 20*np.log(cv2.magnitude(参数1,参数2))1> 参数1:浮点型X坐标值,也就是实部2> 参数2:浮点型Y坐标值,也就是虚部 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) # 移动中心位置 dftShift = np.fft.fftshift(dft) # 调整频谱的范围 result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1])) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(result,cmap=plt.cm.gray) plt.title("result") plt.axis("off") plt.show 傅里叶变换的频谱图像: 2.opencv实现逆傅里叶变换返回结果 = cv2.idft(原始数据)1> 返回结果:取决于原始数据的类型和大小2> 原始数据:实数或者复数均可numpy.fft.ifftshiftfftshift函数的逆函数,将中心位置的低频,重新移到左上角调整频谱的范围,映射到[0,255]区间返回值 = cv2.magnitude(参数1,参数2)1> 参数1:浮点型X坐标值,也就是实部2> 参数2:浮点型Y坐标值,也就是虚部 # 将绘制的图显示在窗口 %matplotlib qt5 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r"image\lena.bmp",cv2.IMREAD_GRAYSCALE) # 傅里叶变换 dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT) dftShift = np.fft.fftshift(dft) # 逆傅里叶变换 ishift = np.fft.ifftshift(dftShift) iimg = cv2.idft(ishift) iimg = cv2.magnitude(iimg[:,:,0],iimg[:,:,1]) plt.subplot(1,2,1) plt.imshow(img,cmap=plt.cm.gray) plt.title("original") plt.axis("off") plt.subplot(1,2,2) plt.imshow(iimg,cmap=plt.cm.gray) plt.title("inverse") plt.axis("off") plt.show 将一副图像,进行傅里叶变换和逆傅里叶变换后,进行对比(一样的) 实例:通过opencv实现低通滤波,模糊一副图像
-
【Three.js】知识梳理六:深入理解Three.js中的光源、光照和阴影投影
-
学习骨骼动画:逐步理解BVH文件的引入和播放
-
深入理解Linux内核调试技术——kprobe的使用和实现(第二部分)
-
深入理解吞吐量(TPS)、QPS、并发数和响应时间(RT)的概念
-
深入理解TPS、QPS、吞吐量和并发用户数的区别(二)
-
使用PyTorch实现的UNet-3D:我的理解和代码实践