Python从0到100(七十四):计算机视觉-距离变换算法的实战应用(文末送书)
前言:
零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!
计算机视觉CV是人工智能一个非常重要的领域。 在本次的距离变换任务中,我们将使用D4距离度量方法来对图像进行处理。通过这次实验,我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计算机视觉和图像处理有了更深入的了解。让我们一起来看看实际的计算结果和可视化效果吧!
距离变换是一种常用的方法,它可以帮助我们计算出每个像素点与最近的前景像素点之间的距离。这对于图像分析、目标检测和图像配准等任务至关重要。D4距离定义为两个像素点之间在水平和垂直方向上的绝对距离之和
。通过这种度量方式,我们可以获得每个像素点到最近的前景像素点的距离。为了测试距离变换的效果,我们首先随机生成了一张8*8大小的图像,并随机选取了其中的10个像素点作为前景像素。前景像素用1表示,背景像素用0表示。接下来,我们实现了一个距离函数,用于计算两个像素点之间的D4距离。然后,我们通过遍历图像中的每个像素点,计算其与与其最近的前景像素点的距离,并将结果保存到一个距离矩阵中。最后,我们将原始图像和距离变换后的结果进行可视化展示。使用灰度图像表示原始图像,黑色像素点表示随机生成的前景像素点。而距离变换结果则使用“cool”颜色映射进行显示,较远的像素点呈现较浅的颜色,较近的像素点呈现较深的颜色。
1. 导入必要的库
首先,我们需要导入必要的库,NumPy和Matplotlib库。
import numpy as np
import matplotlib.pyplot as plt
2. 生成随机图像,定义距离度量
随机生成 0/1 像素值的图片,大小为 8*8,0 为背景像素,1 为前景像素
image = np.random.randint(2, size=(8, 8))
print('原始图片:\n', image)
随机选取 10 个前景像素:
for i in range(10):
x, y = np.random.randint(8, size=2)
image[x, y] = 1
print('选取前景像素后的图片:\n', image)
选取前景像素后的图片:
[[1 0 1 1 0 1 0 1]
[0 1 1 0 1 0 0 0]
[1 1 1 1 1 1 0 1]
[0 0 1 0 1 0 1 0]
[0 1 1 0 0 1 0 1]
[0 1 1 1 1 1 1 1]
[1 1 1 1 1 0 1 1]
[0 1 0 1 0 0 1 1]]
3. 进行距离变换
D4距离介绍: 像素p(x,y)和q(s,t)之间的D4距离定义为: = |x – s| + |y – t|
D4距离变换算法是一种常用的图像处理算法,用于计算图像中像素点与最近的前景像素点之间的距离。
在D4距离变换算法中,D4代表了四邻域距离度量
。它仅考虑像素点之间在水平和垂直方向上的差异,而忽略了对角线方向上的差异。
算法步骤如下:
- 初始化一个与原始图像大小相同的距离矩阵,其中所有背景像素点的距离值为0。
- 从图像中选择一个前景像素点作为起点。
- 遍历图像中的每个背景像素点,并计算其到起点像素点的D4距离。
- 比较当前像素点与起点之间的距离与之前计算得到的最小距离,如果当前距离更小,则更新该像素点的距离值为当前距离。
- 重复第3步和第4步,直到遍历完所有的背景像素点。
- 选择下一个前景像素点作为起点,重复以上步骤,直到遍历完所有的前景像素点。
- 最终得到的距离矩阵即为距离变换后的结果,其中每个像素点的距离值表示该像素点到离它最近的前景像素点的距离。
定义距离函数
def dist(p1, p2, metric='D4'):
if metric == 'D4':
return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])
elif metric == 'D8':
return max(abs(p1[0] - p2[0]), abs(p1[1] - p2[1]))
生成距离矩阵
matrix = np.zeros_like(image)
for i in range(image.shape[0]):
for j in range(image.shape[1]):
# 背景像素的距离为 0
if image[i, j] == 0:
matrix[i, j] = 0
else:
# 初始化为一个巨大的数字
min_dist = 99999
for m in range(image.shape[0]):
for n in range(image.shape[1]):
# 只计算背景像素的距离
if image[m, n] == 0:
d = dist((i, j), (m, n), metric='D4')
if d < min_dist:
min_dist = d
matrix[i, j] = min_dist
print('距离变换后的结果:\n', matrix)
距离变换后的结果:
[[1 0 1 1 0 1 0 1]
[0 1 1 0 1 0 0 0]
[1 1 2 1 2 1 0 1]
[0 0 1 0 1 0 1 0]
[0 1 1 0 0 1 0 1]
[0 1 2 1 1 1 1 2]
[1 2 1 2 1 0 1 2]
[0 1 0 1 0 0 1 2]]
4. 可视化处理
在这里,我们使用灰度图像表示原始图像,黑色像素点表示随机生成的像素点。使用“cool”颜色映射可视化距离变换的结果。
Original Image
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.show()
Distance Transformed Image
plt.imshow(matrix, cmap='cool')
plt.title('Distance Transformed Image')
plt.colorbar()
plt.show()
本文介绍了计算机视觉中的距离度量,并使用随机生成的像素点进行了测试,并对计算结果进行了可视化展示。下面我会继续扩充一下这篇文章。
5. 结果分析
通过上述代码,我们可以得到距离变换后的结果。在结果中,黑色像素点表示随机生成的前景像素点,其他颜色表示每个像素点到最近的前景像素点的距离。我们可以看到,距离变换后的图像可以清晰地展示出各个像素点到前景像素点的距离信息。较远的像素点呈现较浅的颜色,而较近的像素点呈现较深的颜色。
总结
距离度量在计算机视觉CV领域有着广泛的应用。如图像分割、图像配准、目标检测和目标跟踪等任务中,都需要计算像素之间的距离来对图像进行处理和分析。而距离变换则可以帮助我们更好地理解像素之间的关系和结构,并为后续的图像处理工作提供基础和参考。
文末送书
Dream送书活动——第四十六期
《AI 时代:弯道超车新思维》免费包邮送三本! 参与方式:
1.点赞收藏文章
2.在评论区留言:人生苦短,我用Python!(多可评论三条)
3.随机抽取3位免费送出!
4.截止时间: 2024-12-03
5.上期中奖名单:zhaohaooo、小昭-May、2401_84393787,请三天内私信我提供获奖信息
本期推荐:
《AI 时代:弯道超车新思维》—— 开启 AI 时代新征程
京东:https://item.jd.com/14859464.html
《AI 时代:弯道超车新思维》是李尚龙精心打磨的成果。在书中,他以极具亲和力的方式,将人工智能的发展历程清晰地呈现在读者眼前。原本晦涩难懂的科技术语,在他的笔下都化为通俗易懂的表述,让普通人也能轻松理解。全书精心布局八个章节,从 “AI 的前世今生” 起始,逐渐深入到 “AI 时代的变革”,直至 “AI 下的个人发展”。每一章都细致地剖析了这个机遇与挑战并存的新时代,并且针对每个环节给出了极具前瞻性的 “答案” 和切实可行的解决方法。
在这个信息爆炸的 AI 时代,知识本身已不再是稀缺资源,关键在于理解和应用知识的能力。本书的核心价值就在于它能帮助读者重塑在 AI 时代的全新思考方式,学会巧妙地 “利用问题” 来驾驭 AI,通过提出有价值的问题,挖掘出未来的 “答案”,进而实现思维和能力的巨大跃迁。
正如李尚龙所说:“未来五到十年,拥抱科技是普通人唯一的出路。” 在这个 AI 引领的时代,《AI 时代:弯道超车新思维》就是你通往未来的良师益友,快来开启你的人工智能探索之旅吧!