删除二值图像中的单个像素
Delete single pixels in binary image
假设我有一个二进制图像,表示为一个 numpy
矩阵,其中一个像素是背景 (0) 或前景 (1)。我正在寻找一种方法来删除前景中没有任何最近邻居的所有像素。
假设图像矩阵为:
a = np.array([[0,0,1,1],[1,0,0,0]])
单像素删除后的结果图应该是
b = np.array([[0,0,1,1],[0,0,0,0]])
到目前为止,我的方法是对所有可能的方向进行开口组合:
opening1 = ndi.morphology.binary_opening(edge, structure=np.array([[0,1,0],[0,1,0],[0,0,0]]))
opening2 = ndi.morphology.binary_opening(edge, structure=np.array([[0,0,0],[0,1,1],[0,0,0]]))
opening3 = ndi.morphology.binary_opening(edge, structure=np.array([[1,0,0],[0,1,0],[0,0,0]]))
opening4 = ndi.morphology.binary_opening(edge, structure=np.array([[0,0,0],[0,1,0],[0,0,1]]))
opening = opening1 + opening2 + opening3 + opening4
另一种方法是标记连接的组件并按索引删除它们,但是当涉及到计算复杂性时,这些解决方案感觉不是最优的。
实际上,标记连接的组件似乎是可行的方法。至少这就是 skimage
在 remove_small_objects
函数 here.
中的做法
这个呢?
想法是在每个方向上创建一个像素的图像偏移,然后通过查看任何偏移中的对应关系来确定是否存在邻居。
import numpy as np
a = np.array([[0,0,1,1],[1,0,0,0]])
print(a)
shift_bottom = np.roll(a, -1, axis=0)
shift_top = np.roll(a, 1, axis=0)
shift_right= np.roll(a, 1, axis=1)
shift_left= np.roll(a, -1, axis=1)
b = (a * shift_bottom) | (a * shift_top) | (a * shift_right) | (a * shift_left)
print(b)
假设我有一个二进制图像,表示为一个 numpy
矩阵,其中一个像素是背景 (0) 或前景 (1)。我正在寻找一种方法来删除前景中没有任何最近邻居的所有像素。
假设图像矩阵为:
a = np.array([[0,0,1,1],[1,0,0,0]])
单像素删除后的结果图应该是
b = np.array([[0,0,1,1],[0,0,0,0]])
到目前为止,我的方法是对所有可能的方向进行开口组合:
opening1 = ndi.morphology.binary_opening(edge, structure=np.array([[0,1,0],[0,1,0],[0,0,0]]))
opening2 = ndi.morphology.binary_opening(edge, structure=np.array([[0,0,0],[0,1,1],[0,0,0]]))
opening3 = ndi.morphology.binary_opening(edge, structure=np.array([[1,0,0],[0,1,0],[0,0,0]]))
opening4 = ndi.morphology.binary_opening(edge, structure=np.array([[0,0,0],[0,1,0],[0,0,1]]))
opening = opening1 + opening2 + opening3 + opening4
另一种方法是标记连接的组件并按索引删除它们,但是当涉及到计算复杂性时,这些解决方案感觉不是最优的。
实际上,标记连接的组件似乎是可行的方法。至少这就是 skimage
在 remove_small_objects
函数 here.
这个呢?
想法是在每个方向上创建一个像素的图像偏移,然后通过查看任何偏移中的对应关系来确定是否存在邻居。
import numpy as np
a = np.array([[0,0,1,1],[1,0,0,0]])
print(a)
shift_bottom = np.roll(a, -1, axis=0)
shift_top = np.roll(a, 1, axis=0)
shift_right= np.roll(a, 1, axis=1)
shift_left= np.roll(a, -1, axis=1)
b = (a * shift_bottom) | (a * shift_top) | (a * shift_right) | (a * shift_left)
print(b)