如何使用python进行radon变换来检测线?

qij5mzcb  于 2023-04-19  发布在  Python
关注(0)|答案(1)|浏览(150)

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')

bxjv4tth

bxjv4tth1#

使用python的scikit-image,使用radon转换,行检测很容易
正弦图包括一组不同Angular 的一维投影,正弦图的每一行包含一个投影。正弦图的最亮部分对应于原始图像中的白色区域。正弦图中的区域越亮,原始图像中的对象的共线性越大。我们假设正弦图的最大值的坐标与直线相关。我们使用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

同样你可以在垂直轴上找到像素值

相关问题