图像轮廓强度
Image profile intensity
为什么我正在处理的图像的强度分布不包括右端?我应该看到 7 个“峰”,但我没有。
下面是我的代码:
from matplotlib import pyplot as plt
from skimage.measure import profile_line
from skimage.io import imread
start = (0, 714) #Start of the profile line
end = (100, 100) #End of the profile line
#image = imread('....tif') #Read the images
profile = profile_line(image, start, end, linewidth=1, mode='constant') #Take the profile line
fig, ax = plt.subplots(2, 1, figsize=(10, 10)) #Create the figures
ax[0].imshow(image) #Show the film at the top
ax[0].plot(start, end, 'r-', lw=2) #Plot a red line across the film
ax[1].plot(profile)
ax[1].grid()
结果图:
我正在处理的片子:
您在这里混淆了一堆不同的概念。一方面,您的可视化是错误的。 skimage.measure.profile_line
accepts two points in (row, col)
coordinates. matplotlib.pyplot.plot
接受两个数据集,一个 x
和一个 y
。通过将 start
绘制为 x
并将 end
绘制为 y
,您会迷惑自己并相信您拥有的线是水平的。让我们获取 profile_line
正在切割的 x
坐标(列)并正确绘制它们,y
坐标(行)也是如此:
start = (0, 714) #Start of the profile line
end = (100, 100) #End of the profile line
image = skimage.io.imread(...)
fig, ax = plt.subplots(1, 2)
ax[0].set_title('Wrong')
ax[0].imshow(image)
ax[0].plot(start, end, 'r')
ax[1].set_title('Correct')
ax[1].imshow(image)
ax[1].plot([start[1], end[1]], [start[0], end[0]], 'r')
结果如下:
希望您看到标有“正确”的图像准确显示了您在情节中看到的内容。
您可以轻松更正此问题。首先,让我们用复杂的方式来做:使用 profile_line
。您希望开始和结束 y 坐标相同,并且开始和结束 x 坐标跨越图像。请记住,profile_line
包含两端:
image = skimage.io.imread(...)
start = (100, 0) #Start of the profile line row=100, col=0
end = (100, image.shape[1] - 1) #End of the profile line row=100, col=last
profile = skimage.measure.profile_line(image, start, end)
fig, ax = plt.subplots(1, 2)
ax[0].set_title('Image')
ax[0].imshow(image)
ax[0].plot([start[1], end[1]], [start[0], end[0]], 'r')
ax[1].set_title('Profile')
ax[1].plot(profile)
这看起来好多了。对于垂直和水平横截面,您可以使用简单的 indexing. The images loaded by skimage.io.imread
are numpy arrays 获得相同的结果,因此您可以这样做:
profile = image[100, :]
对于垂直线,比如在第 202 列,您沿着第二(列)轴索引:
profile = image[:, 202]
为什么我正在处理的图像的强度分布不包括右端?我应该看到 7 个“峰”,但我没有。
下面是我的代码:
from matplotlib import pyplot as plt
from skimage.measure import profile_line
from skimage.io import imread
start = (0, 714) #Start of the profile line
end = (100, 100) #End of the profile line
#image = imread('....tif') #Read the images
profile = profile_line(image, start, end, linewidth=1, mode='constant') #Take the profile line
fig, ax = plt.subplots(2, 1, figsize=(10, 10)) #Create the figures
ax[0].imshow(image) #Show the film at the top
ax[0].plot(start, end, 'r-', lw=2) #Plot a red line across the film
ax[1].plot(profile)
ax[1].grid()
结果图:
我正在处理的片子:
您在这里混淆了一堆不同的概念。一方面,您的可视化是错误的。 skimage.measure.profile_line
accepts two points in (row, col)
coordinates. matplotlib.pyplot.plot
接受两个数据集,一个 x
和一个 y
。通过将 start
绘制为 x
并将 end
绘制为 y
,您会迷惑自己并相信您拥有的线是水平的。让我们获取 profile_line
正在切割的 x
坐标(列)并正确绘制它们,y
坐标(行)也是如此:
start = (0, 714) #Start of the profile line
end = (100, 100) #End of the profile line
image = skimage.io.imread(...)
fig, ax = plt.subplots(1, 2)
ax[0].set_title('Wrong')
ax[0].imshow(image)
ax[0].plot(start, end, 'r')
ax[1].set_title('Correct')
ax[1].imshow(image)
ax[1].plot([start[1], end[1]], [start[0], end[0]], 'r')
结果如下:
希望您看到标有“正确”的图像准确显示了您在情节中看到的内容。
您可以轻松更正此问题。首先,让我们用复杂的方式来做:使用 profile_line
。您希望开始和结束 y 坐标相同,并且开始和结束 x 坐标跨越图像。请记住,profile_line
包含两端:
image = skimage.io.imread(...)
start = (100, 0) #Start of the profile line row=100, col=0
end = (100, image.shape[1] - 1) #End of the profile line row=100, col=last
profile = skimage.measure.profile_line(image, start, end)
fig, ax = plt.subplots(1, 2)
ax[0].set_title('Image')
ax[0].imshow(image)
ax[0].plot([start[1], end[1]], [start[0], end[0]], 'r')
ax[1].set_title('Profile')
ax[1].plot(profile)
这看起来好多了。对于垂直和水平横截面,您可以使用简单的 indexing. The images loaded by skimage.io.imread
are numpy arrays 获得相同的结果,因此您可以这样做:
profile = image[100, :]
对于垂直线,比如在第 202 列,您沿着第二(列)轴索引:
profile = image[:, 202]