python - 改进高斯滤波器+阈值
问题描述
我正在为物理体验制作一组图片:https ://filesender.renater.fr/?s=download&token=f08936bf-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。
如果您有任何想法可以帮助我解决这个高斯滤波器和阈值,请随意!我已经尝试过精明的边缘检测,但不幸的是它并没有取得很大的成功。
最好的问候,尼古拉斯。
解决方案
推荐阅读
- visual-studio-code - 通过 SSH 网关的 VSCode Remote-SSH 扩展?
- javascript - 出现错误无法发布 /undefined/signup
- python - 正则表达式搜索列表,但返回相同大小的列表
- active-directory - 为另一个域打开组策略管理控制台 (gpmc)
- javascript - 我需要使用 vue 模板中的动态名称引用 ref 参数
- javascript - 显示字符串中的所有正则表达式匹配
- telegram - Telegram Bot 深度链接:最大有效负载长度是否为 64 个字符?
- plotly - 创建带有行标题的绘图表,输入值是行列表
- c# - GridView 编辑模板中的下拉列表仅返回空值
- flutter - 在哪里可以找到最新的 Flutter 课程?