图像轮廓强度

Posted

技术标签:

【中文标题】图像轮廓强度【英文标题】:Image profile intensity 【发布时间】:2022-01-11 17:09:21 【问题描述】:

为什么我正在处理的图像的强度分布不包括右端?我应该看到 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()

结果图:

我正在处理的胶卷:

【问题讨论】:

试试start = (100,0)end = (100,714) @Eumel 非常感谢,它似乎有效! 你能发两张图片吗?一个是感兴趣的,一个是情节的?你也可以把你的代码变成一个正确的minimal reproducible example吗?例如,您不应该有一个循环来加载多个文件。 你愿意使用 numpy 或其他库来完成这项任务吗?它会让你的代码变得无限简单。 plt.plot(x, y),但skimage.measure.profile_line(image, start, end)。您绘制的线与您实际在做的不匹配,并且您的开始和结束是不明智的。投票结束是一个错字。 【参考方案1】:

您在这里混淆了一堆不同的概念。一方面,您的可视化是错误的。 skimage.measure.profile_line 接受 (row, col) 坐标中的两个点。 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 获得相同的结果。 skimage.io.imread加载的图片是numpy arrays,所以你可以这样做:

profile = image[100, :]

对于一条垂直线,例如在第 202 列,您沿着第二个(列)轴索引:

profile = image[:, 202]

【讨论】:

非常感谢您的澄清/解释和回答!事实上,我认为我的线是水平的。再次感谢。

以上是关于图像轮廓强度的主要内容,如果未能解决你的问题,请参考以下文章

图像处理 - 计算二值图像中空白质心的算法

OpenCV-Python17.OpenCV的图像轮廓——轮廓特征

教你如何使用 OpenCV检测图像中的轮廓

教你如何使用 OpenCV检测图像中的轮廓

如何从图像中提取不同边缘强度的矩形?

《数字图像处理》读书笔记