$Vert x \Vert_1$的图像
时间: 2024-01-01 14:06:21 浏览: 117
$ \Vert x \Vert_1$ 表示 $x$ 的 L1 范数,即向量 $x$ 中各元素绝对值之和。其图像可以表示为:
![L1 Norm](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Manhattan_distance.svg/220px-Manhattan_distance.svg.png)
其中,蓝色实线表示 $x$ 的 L1 范数。可以看到,L1 范数相当于原点到向量 $x$ 的曼哈顿距离。当 $x$ 是二维向量时,L1 范数可以表示为一个菱形。
相关问题
import cv2 import numpy as np import PIL.ImageDraw SCALE = 0.65156853729882650681169151675877 # m/px def add_chinese_text(img, text, position, textColor, textSize): img = PIL.Image.fromarray(img) draw = PIL.ImageDraw.Draw(img) fontStyle = PIL.ImageFont.truetype('simsun.ttc', textSize, encoding='utf-8') draw.text(position, text, textColor, font=fontStyle, stroke_width=1) return np.asarray(img) def main(): # 读取verts with open('verts.txt', 'r', encoding='utf8') as f: verts = f.readlines() verts = list(map(lambda x: x.split(), verts)) verts = list(map(lambda x: [x[0], int(x[1]), int(x[2])], verts)) print(f'{verts=}') # 读取edges with open('edges.txt', 'r', encoding='utf8') as f: edges = f.readlines() edges = list(map(lambda x: x.split(), edges)) edges = list(map(lambda x: [int(x[0]), int(x[1])], edges)) print(f'{edges=}') # 显示地图 im = cv2.imread('map.png') for edge in edges: v1 = verts[edge[0]] # 边关联的点1 v2 = verts[edge[1]] # 边关联的点2 weight = int((((v1[1] - v2[1]) ** 2 + (v1[2] - v2[2]) ** 2) ** 0.5) * SCALE) # 权重为两点欧氏距离 cv2.line(im, (v1[1], v1[2]), (v2[1], v2[2]), (255, 0, 0), 5) # 绘制边的直线 im = add_chinese_text(im, str(weight), ((v1[1] + v2[1]) // 2, (v1[2] + v2[2]) // 2), (255, 0, 255), 30) # 绘制边的权重 for i, vert in enumerate(verts): cv2.circle(im, (vert[1], vert[2]), 20, (255, 0, 0), 2) # 绘制顶点圆圈 im = add_chinese_text(im, str(i), (vert[1] - 15, vert[2] - 15), (255, 0, 255), 30) # 绘制顶点圈中序号数字 im = add_chinese_text(im, vert[0], (vert[1] - 40, vert[2] + 25), (255, 0, 255), 30) # 绘制顶点下方文字 cv2.namedWindow('map', cv2.WINDOW_KEEPRATIO) cv2.imshow('map', im) cv2.waitKey() if __name__ == '__main__': main()
这段代码导入了三个模块:
1. cv2:这是一个用于计算机视觉的库,可以用来处理图像和视频数据。
2. numpy:这是一个用于科学计算的库,主要用于处理数组和矩阵的运算。
3. PIL.ImageDraw:这是 Python Imaging Library (PIL) 中的一个模块,用于在图像上绘图。
SCALE 这个常量的值是一个浮点数,代表一个缩放比例。
function [gradient, or] = canny(im, sigma, scaling, vert, horz) xscaling = vert; yscaling = horz; hsize = [6*sigma+1, 6*sigma+1]; % The filter size. gaussian = fspecial('gaussian',hsize,sigma); im = filter2(gaussian,im); % Smoothed image. im = imresize(im, scaling); [rows, cols] = size(im); h = [ im(:,2:cols) zeros(rows,1) ] - [ zeros(rows,1) im(:,1:cols-1) ]; v = [ im(2:rows,:); zeros(1,cols) ] - [ zeros(1,cols); im(1:rows-1,:) ]; d1 = [ im(2:rows,2:cols) zeros(rows-1,1); zeros(1,cols) ] - ... [ zeros(1,cols); zeros(rows-1,1) im(1:rows-1,1:cols-1) ]; d2 = [ zeros(1,cols); im(1:rows-1,2:cols) zeros(rows-1,1); ] - ... [ zeros(rows-1,1) im(2:rows,1:cols-1); zeros(1,cols) ]; X = ( h + (d1 + d2)/2.0 ) * xscaling; Y = ( v + (d1 - d2)/2.0 ) * yscaling; gradient = sqrt(X.*X + Y.*Y); % Gradient amplitude. or = atan2(-Y, X); % Angles -pi to + pi. neg = or<0; % Map angles to 0-pi. or = or.*~neg + (or+pi).*neg; or = or*180/pi; % Convert to degrees.
这段代码是用于实现Canny边缘检测算法。函数`canny`接受五个参数:`im`表示输入图像,`sigma`表示高斯滤波器的标准差,`scaling`表示图像的缩放比例,`vert`表示垂直方向的缩放因子,`horz`表示水平方向的缩放因子。
首先,根据给定的标准差`sigma`计算高斯滤波器的大小`hsize`。
然后,使用`fspecial('gaussian',hsize,sigma)`生成高斯滤波器。
接下来,对输入图像进行高斯平滑处理,使用`im = filter2(gaussian,im)`。
然后,根据指定的缩放比例对图像进行缩放处理,使用`im = imresize(im, scaling)`。
接着,获取缩放后图像的大小`[rows, cols] = size(im)`。
接下来,利用差分近似计算水平方向、垂直方向和两个对角线方向上的梯度值。分别计算了`h`, `v`, `d1`, `d2`四个梯度。
然后,根据水平和垂直方向上的缩放因子对梯度进行缩放。
接着,计算梯度幅值,使用公式`gradient = sqrt(X.*X + Y.*Y)`。
然后,计算梯度方向,使用公式`or = atan2(-Y, X)`。并将角度转换为0到180度的范围。
最后,返回梯度幅值和梯度方向`gradient`和`or`。
阅读全文