Gostaria de separar as franjas (as linhas curvas vermelhas) que calculei com o scipy findpeaks, como posso fazer isso? Gostaria de separá-las e armazená-las no arquivo de texto.
import numpy as np
from scipy.signal import find_peaks
import matplotlib.pyplot as plt
X = np.load('X.npy')
Y = np.load('Y.npy')
P_new = np.load('P_new.npy')
# Example data: Replace with your actual data
T = np.real(P_new) # Simulating a 2D matrix
# Plot the original image
plt.figure()
plt.imshow(T, cmap='jet', aspect='auto')
plt.colorbar()
plt.title('Original Image')
plt.show()
# Peak detection parameters
min_peak_dist = 3 # Minimum distance between peaks
min_peak_h = 3e-5 # Minimum peak height
x_coords = []
y_coords = []
# Process all rows from top to bottom
for k in range(T.shape[0]):
tex = T[k, :]
peaks, _ = find_peaks(tex, distance=min_peak_dist, height=min_peak_h)
if peaks.size > 0:
x_coords.extend(X[k, peaks])
y_coords.extend(Y[k, peaks])
# Plot detected peaks
plt.figure()
plt.scatter(x_coords, y_coords, color='r', s=2) # 's' controls marker size
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.title('Detected Fringes in Real-World Coordinates')
plt.colorbar()
plt.show()
os dados para plotagem estão aqui
O que eu quero ver são apenas franjas separadas como aqui:
anteriormente eu conseguia fazer isso com o método cv2 contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE), mas isso é para encontrar as bordas, o que não é muito rigoroso para o meu caso, assim como encontrar picos dos dados reais.
Alguém pode ajudar com isso? Obrigado
Tive sucesso razoável usando
HDBSCAN
.Primeiro corri
find_peaks
para encontrar picos ao longo de y (em vez de ao longo de x) - essas são as linhas pretas. Então recortei a imagem para dentro do quadrado azul e agrupei os pontos usando HDBSCAN. Os agrupamentos finais são coloridos.Para traçar um cluster específico, você pode usar:
Solução
Carregar dados e pré-processar:
Agrupe e visualize: