从 Geotiff 二值图像中去除单个像素

Removing the single pixels from Geotiff bianary image

这是卫星的分类图像。谁能告诉我如何删除这些单个像素并过滤掉它们。请记住,这是 Geotiff 格式。我已经应用了腐蚀或膨胀技术,但没有成功。

我会尝试 中值滤波器 (cv2.medianBlur),它应该可以去除单个像素,但也可能有其他效果。您需要使用几种不同的设置对其进行测试,然后确定它是否能为您提供可接受的结果。

中值滤波器的内核大小应该是奇数,因此中值用于奇数个像素(尺寸 3 为 9,尺寸 5 为 25,尺寸 7 为 49,依此类推),因此 中值Filter 从不引入新值,因此如果您使用二值图像作为输入,您将得到二值图像作为输出。

我在 SO 上看到了类似的问题,但找不到了。我为自己重做了一个很好的答案。所以这里是名为 particle_filter 的方法,它将解决您的问题:

def particle_filter(image_, power):
    nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(image_, connectivity=8)
    sizes = stats[1:, -1]
    nb_components = nb_components - 1

    min_size = power

    img2 = np.zeros(output.shape, dtype=np.uint8)
    for i in range(0, nb_components):
        if sizes[i] >= min_size:
            img_to_compare = threshold_gray_const(output, (i + 1, i + 1))
            img2 = binary_or(img2, img_to_compare)

    img2 = img2.astype(np.uint8)
    return img2


def threshold_gray_const(image_, rang: tuple):
    return cv2.inRange(image_, rang[0], rang[1])


def binary_or(image_1, image_2):
    return cv2.bitwise_or(image_1, image_2)

您需要做的就是调用此函数并将二值图像作为第一个参数,过滤能力作为第二个参数。
一点解释:整个方法 - 只是简单地迭代图像上的对象,如果一个对象的面积小于 power,那么它只是 removed .