从 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 .
这是卫星的分类图像。谁能告诉我如何删除这些单个像素并过滤掉它们。请记住,这是 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 .