小能豆

如何使用 python 通过氡变换检测线?

py

MATLAB 解决方案可以在互联网上的其他地方找到,但需要基于开源 Python 的解决方案。

启动代码创建带有白线的空白图像。

import cv2
import numpy as np
from skimage.transform import radon
from matplotlib import pyplot as plt

blank = np.zeros((100,100))
blank = cv2.line(blank, (25,25), (75,75), (255, 255, 255), thickness=1)
plt.imshow(blank, cmap='gray')

1.png


阅读 24

收藏
2024-12-26

共1个答案

小能豆

使用 Python 的scikit-imageusingradon变换可以轻松实现线检测

正弦图由一组不同角度的一维投影组成,正弦图的每一行包含一个投影。正弦图最亮的部分对应于原始图像中的白色区域。正弦图中的区域越亮,原始图像中对象的共线性就越大。我们假设正弦图最大值的坐标与一条直线相关。让我们使用radon变换并绘制正弦图。

sinogram = radon(blank) 
plt.title("Radon transform\n(Sinogram)")
plt.xlabel("Projection angle (deg)")
plt.ylabel("Projection position (pixels)")
plt.imshow(sinogram, cmap='gray')
plt.show()

1.png

我们可以看到最亮点位于 45 度(横轴)处,以行像素=50(纵轴)为中心

找到每行的 RMS 值,并找到最亮的旋转,其中变换与线完美对齐

r = np.array([np.sqrt(np.mean(np.abs(line) ** 2)) for line in sinogram.transpose()])

angle = np.argmax(r)
print('Angle: {:.1f} degrees'.format(90 - angle))

它输出

Angle: 45.0 degrees

类似地,你可以在垂直轴上找到像素值

2024-12-26