Python 消除小于某个指定数目阈值的连接像素数

Python 消除小于某个指定数目阈值的连接像素数,python,image,matplotlib,plot,Python,Image,Matplotlib,Plot,我有一些数据,尺寸是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,23

我有一些数据,尺寸是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)。我怎样才能做到这一点?

基本上,您要做的是识别图像中的所有对象。这可以通过
scipy中的
ndimage.measurements.label
来完成。
基本上,它在图像中搜索连续的像素组,并为它们指定一个标签。然后,您可以循环通过这些标记的扇区,计算对象的大小(以像素为单位),并在此基础上进行过滤

即使您正在从Excel中提取数据——实际上您拥有的是一个249x250像素的“图像”,您正在打印。Excel中的每个单元格实际上是一个包含值的“像素”。为了使这一点更加明确,您可以直接使用matplotlib中的图像显示功能(例如
plt.imshow

导入matplotlib.pyplot作为plt
将numpy作为np导入
从scipy导入ndimage
xn=250
yn=249
#伪造数据以说明图像只是值的矩阵
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基本上,您要做的是识别图像中的所有对象。这可以通过
ndimage.measurements.label
scipy中完成。
基本上,它在图像中搜索连续的像素组,并为它们指定一个标签。然后,您可以在这些标记的扇区中循环并计算大小对象的(以像素为单位)并在此基础上进行过滤

即使您正在从Excel中提取数据——实际上您拥有的是一个249x250像素的“图像”,您正在打印。Excel中的每个单元格实际上都是一个包含值的“像素”。要明确这一点,您可以直接使用matplotlib中的图像显示功能(例如
plt.imshow

导入matplotlib.pyplot作为plt
将numpy作为np导入
从scipy导入ndimage
xn=250
yn=249
#伪造数据以说明图像只是值的矩阵
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但我有excel文件中的数据。它不是一个图像。你有
数据
屏蔽数据
,如果你想从
屏蔽数据
工作,它看起来像
屏蔽数据。fill(255)
会将其转换为常规的np.array,也许你也需要转换为uint8:
np.array(data,dtype=np.uint8)
-然后图像处理功能应将其识别为灰度图像,但我在excel文件中有数据。它不是图像。您有
数据
屏蔽数据
,如果要从
屏蔽数据
工作,它看起来像
屏蔽数据。填充(255)
将其转换为常规np.array,可能您也需要转换为uint8:
np.array(数据,dtype=np.uint8)
-然后图像处理功能应将其识别为灰度图像
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")