我有一些数据,尺寸是249X250。我使用以下代码绘制数据:
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()
并且情节如下:
现在我想删除绘图右侧的较小补丁,并希望仅保留最大的补丁。为此,我的逻辑是移除连接像素数小于某个指定阈值的连接像素(为此目的,它为200)。我怎么能这样做?
答案 0 :(得分:2)
基本上您要做的是识别图像中的所有对象。可以使用ndimage.measurements.label
中的scipy.
来完成此操作。实际上,它会在图像中搜索连续的像素组,并为其指定标签。然后,您可以遍历这些标记的扇区并计算对象的大小(以像素为单位)并在此基础上进行过滤。
即使您从Excel中提取数据 - 您实际拥有的是您正在绘制的249x250像素“图像”。 Excel中的每个单元格实际上都是包含值的“像素”。要将这一点推向家庭,您可以完全使用matplotlib中的图像显示功能(例如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")