本帖最后由 学习编程中的Ben 于 2023-8-4 16:29 编辑
根据您提供的代码,有几个问题可能导致最终绘制的沙脊线不正确:
1. 彩色图像转换为灰度图像时,使用了color.rgb2gray()函数,但是在导入语句中没有引入color模块。请将导入语句修改为from skimage import filters, img_as_ubyte, color。
2. 在边缘检测时,使用了filters.sobel()函数对灰度图像进行处理。这一步骤应该是正确的。
3. 在Hough变换的相关函数调用中,使用了zip(*hough_line_peaks(h, theta, d))。请将这部分修改为zip(h, theta, d)。
4. 在绘制沙脊线时,计算直线的起点和终点坐标的公式可能存在问题。您可以尝试使用以下公式计算:
y0 = (dist - 0 * np.cos(theta)) / np.sin(theta)
y1 = (dist - gray_image.shape[1] * np.cos(theta)) / np.sin(theta)
请注意,我对代码进行了上述修改。以下是修改后的代码:
from tifffile import imread
from skimage import filters, img_as_ubyte, color
import matplotlib.pyplot as plt
import numpy as np
from skimage.transform import hough_line, hough_line_peaks
# 使用tifffile库读取TIFF格式的RGB影像
image = imread('F:\\duneline\\dune\\dune.tif')
# 将影像转换为灰度图像
gray_image = color.rgb2gray(image)
# 将灰度图像转换为8位无符号整数格式,因为后续的图像处理函数需要这种格式
edges = filters.sobel(img_as_ubyte(gray_image))
# 使用Hough变换找出可能的直线
tested_angles = np.linspace(-np.pi / 2, np.pi / 2, 360)
h, theta, d = hough_line(edges, theta=tested_angles)
# 在原图上画出沙丘脊线
fig, ax = plt.subplots()
ax.imshow(image, cmap=plt.cm.gray)
for _, angle, dist in zip(h, theta, d):
y0 = (dist - 0 * np.cos(angle)) / np.sin(angle)
y1 = (dist - gray_image.shape[1] * np.cos(angle)) / np.sin(angle)
ax.plot((0, gray_image.shape[1]), (y0, y1), '-r')
plt.show()
希望以上修改能够解决您的问题!如果您有任何其他疑问,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!
|