在曼哈顿的街道布局中,所有街道都是相互垂直的,因此从一个点到达另一个点,需要沿着水平方向和垂直方向分别移动一定的距离。曼哈顿距离就是这两个距离的总和。

曼哈顿距离具有以下特点:

  • 曼哈顿距离是非负的。
  • 曼哈顿距离满足三角不等式。
  • 曼哈顿距离是欧几里得距离的下界。

曼哈顿距离在许多领域都有应用,

  • 图像处理:曼哈顿距离可以用于计算图像的边缘强度
  • 机器学习:曼哈顿距离可以用于计算两个数据点的距离,并用于分类和回归任务。
  • 自然语言处理:曼哈顿距离可以用于计算两个文本的相似度

Demo

Manhattan Distance for Image Edge Strength

import numpy as np
import cv2
 
def manhattan_distance(image):
  """
  计算图像边缘强度
 
  Args:
    image: 形状为 (h, w, 3) 的数组,代表图像
 
  Returns:
    形状为 (h, w) 的数组,代表边缘强度
  """
 
  # 将图像转换为灰度图像,后面的系数是人眼对红绿蓝敏感度的权重
  gray_image = np.dot(image[...,:3], [0.2989, 0.5870, 0.1140])
 
  # 对图像进行高斯滤波
  filtered_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
 
  # 计算每个像素点与其相邻像素点的曼哈顿距离
  edge_image = np.zeros_like(filtered_image)
  for i in range(1, filtered_image.shape[0] - 1):
    for j in range(1, filtered_image.shape[1] - 1):
      edge_image[i, j] = np.sum(np.abs(filtered_image[i-1:i+2, j-1:j+2] - filtered_image[i, j]))
 
  return edge_image
 
# 读取图像
image = cv2.imread('image.png')
 
# 计算图像边缘强度
edge_image = manhattan_distance(image)
 
# 显示边缘图像
cv2.imshow('Edge Image', edge_image)
cv2.waitKey(0)
cv2.destroyAllWindows()