首页 > 解决方案 > 改进高斯滤波器+阈值

问题描述

我正在为物理体验制作一组图片:https ://filesender.renater.fr/?s=download&token=f0​​8936bf-074d-07e1-a2f7-5c93cf74c194

在文件夹中,有 3 个图像集。对于它们中的每一个,我们每毫秒拍摄很多照片,在每张照片上,我们在白色背景上有 4 个黑点。我的目标是通过测量上点和较平点之间的变形以及从左到右的变形来获得绘图。

import matplotlib.pyplot as plt
import scipy
from skimage import filters
from skimage import measure
from operator import itemgetter
import glob

plt.interactive(False)


def trouve(titre):
    #Extract time in the image title
    local_tiretbas = titre.rfind('_')+1
    local_tiff = titre.find('.tiff')
    return float(titre[local_tiretbas:local_tiff])


array_results = []

image_list = sorted(glob.glob('/home/nicolas/PycharmProjects/Imagerie/14/t1_ep_p/*.tiff'), key=trouve)

T = [] #TimeList
for i in range(len(image_list)):
   T.append(trouve(image_list[i]))
   picture = plt.imread(image_list[i])
   cutout = picture[900:1150, int(350 + i*2.8):int(650 + 3.2*i)]
   cutout_improved = filters.gaussian(cutout, sigma=3)
   val = filters.threshold_otsu(cutout_improved)
   mask = cutout_improved < val
   mask_filled = scipy.ndimage.morphology.binary_fill_holes(mask)
   I_label = measure.label(mask_filled,background=0)
   region_properties = measure.regionprops(I_label)


   l = []
for label in region_properties:
    centroid = label.centroid
    l.append(centroid)  
tuple_values = (max(l, key=itemgetter(1))[1]-min(l, key=itemgetter(1))[1], max(l, key=itemgetter(0))[0]-min(l, key=itemgetter(0))[0])
array_results.append(tuple_values)
l0 = array_results[0][0]
h0 = array_results[0][1]
DL = [i[0]/l0 for i in array_results]
DT = [i[1]/h0 for i in array_results]
plt.plot(T, DL, label='Déplacement longitudinal', color='green')
plt.plot(T, DT, label='Déplacement transversal', color='red')
plt.legend(loc='best')
plt.show()

我成功获得的最佳结果是一个数据集的这张图片。这并不完美,但这很酷。但是对于剩下的两个,此代码不起作用,我正在寻找一些技巧来定位黑点。到目前为止,我只使用了 skimage,但如果它工作得更好,我也可能会使用 openCV。

这是我得到的最好结果

这是预期的结果

如果您有任何想法可以帮助我解决这个高斯滤波器和阈值,请随意!我已经尝试过精明的边缘检测,但不幸的是它并没有取得很大的成功。

最好的问候,尼古拉斯。

标签: pythonscikit-image

解决方案


推荐阅读