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')
使用 Python 的scikit-imageusingradon变换可以轻松实现线检测
scikit-image
radon
正弦图由一组不同角度的一维投影组成,正弦图的每一行包含一个投影。正弦图最亮的部分对应于原始图像中的白色区域。正弦图中的区域越亮,原始图像中对象的共线性就越大。我们假设正弦图最大值的坐标与一条直线相关。让我们使用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()
我们可以看到最亮点位于 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
类似地,你可以在垂直轴上找到像素值