2017-12-28 10 views
0

Ich habe einige Daten und die Dimension ist 249X250. Ich habe den folgenden Code zum Plotten der Daten verwendet:Die Anzahl der angeschlossenen Pixel ist kleiner als eine bestimmte Anzahl an Schwellenwerten.

import numpy as np 

import pandas as pd 

import matplotlib.pyplot as pl 

data = pd.read_excel("sample_data.xlsx") 

x = np.arange(data.shape[0]) 

y = np.arange(data.shape[1]) 

mask_data = np.ma.masked_outside(data,0,233) 


pl.contourf(y,x,mask_data) 

pl.colorbar() 

und die Handlung kam so:

Plot

Jetzt möchte ich die kleineren Flecken auf der rechten Seite des Grundstücks entfernen und Ich möchte nur die größten Patches behalten. Zu diesem Zweck besteht meine Logik darin, diejenigen verbundenen Pixel zu entfernen, bei denen die Anzahl der verbundenen Pixel geringer ist als ein bestimmter Schwellenwert (zu diesem Zweck ist es 200). Wie kann ich das machen?

+1

https://www.learnopencv.com/blob-detection- using-opencv-python-c/ – f5r5e5d

+0

Aber ich habe die Daten in der Excel-Datei. Es ist kein Bild. – sam

+0

Sie haben 'data',' masked_data', wenn Sie von 'masked_data' arbeiten wollen, sieht es aus wie' masked_data.fill (255) 'würde es in ein reguläres np.array umwandeln, vielleicht müssen Sie auch nach uint8 umwandeln: 'np.array (data, dtype = np.uint8)' - dann sollte es von Bildverarbeitungsfunktionen als Graustufenbild erkannt werden – f5r5e5d

Antwort

2

Im Wesentlichen suchen Sie nach allen Objekten in Ihrem Bild. Dies kann mit ndimage.measurements.label von scipy. getan werden Im Wesentlichen durchsucht es ein Bild für kontinuierliche Pixelgruppen und weist ihnen eine Bezeichnung zu. Sie können dann die markierten Sektoren durchlaufen und die Größe (in Pixel) des Objekts zählen und auf dieser Grundlage filtern.

Obwohl Sie Daten aus Excel ziehen - was Sie effektiv haben, ist ein 249x250 Pixel "Bild", das Sie planen. Jede Zelle in Excel ist effektiv ein "Pixel", das einen Wert enthält. Um diesen Punkt nach Hause fahren konnte man buchstäblich die Bild zeigt verwenden Funktionen in matplotlib (zB plt.imshow)

import matplotlib.pyplot as plt 
import numpy as np 
from scipy import ndimage 

xn = 250 
yn = 249 

# fake data to illustrate that images are just matrices of values 
X = np.stack([np.arange(xn)] * yn) 
Y = np.stack([np.arange(yn)] * xn).transpose() 
Z = np.sin(3*np.pi * X/xn) * np.cos(4*np.pi * Y/yn) * np.sin(np.pi * X/xn) 
Z[Z <.5] = 0 

fig,axes = plt.subplots(1,2) 
axes[0].contourf(Z) 
axes[0].set_title("Before Removing Features") 

# now identify the objects and remove those above a threshold 
Zlabeled,Nlabels = ndimage.measurements.label(Z) 
label_size = [(Zlabeled == label).sum() for label in range(Nlabels + 1)] 
for label,size in enumerate(label_size): print("label %s is %s pixels in size" % (label,size)) 

# now remove the labels 
for label,size in enumerate(label_size): 
    if size < 1800: 
     Z[Zlabeled == label] = 0 

axes[1].contourf(Z) 
axes[1].set_title("After Removing Features") 

Illustrated Ergebnis: enter image description here

+0

Es funktioniert ... Vielen Dank ... – sam

Verwandte Themen