我有一张黑白图像,上面有很多噪点。我想把完全被白色像素包围的黑色像素去掉。我尝试使用Filter2d进行操作,但是没有成功。
我有一张黑白图像,上面有很多噪点。我想把完全被白色像素包围的黑色像素去掉。我尝试使用Filter2d进行操作,但是没有成功。
我会再次使用卷积(Convolution)1:
>>> import numpy as np
>>> from scipy.signal import convolve2d
>>>
>>> kernel = np.ones((3,3))
>>> kernel[1,1] = 0
>>> print(kernel)
[[ 1. 1. 1.]
[ 1. 0. 1.]
[ 1. 1. 1.]]
>>> # Create a decent test array that shows the features
... test = np.array(
... [[0,1,1,0,1,1],
... [1,1,1,1,1,0],
... [1,0,1,1,0,1],
... [1,1,1,0,0,0],
... [1,1,1,0,1,0],
... [1,1,1,0,0,0]])
>>>
>>> mask = convolve2d(test, kernel, mode='same', fillvalue=1)
>>> print(mask)
[[ 8. 7. 7. 8. 6. 7.]
[ 6. 6. 6. 6. 5. 7.]
[ 7. 8. 6. 5. 4. 4.]
[ 7. 7. 5. 5. 3. 5.]
[ 8. 8. 5. 4. 0. 4.]
[ 8. 8. 6. 6. 4. 6.]]
>>> result = test.copy()
>>> result[np.logical_and(mask==8, test==0)] = 1
>>> print(result)
[[1 1 1 1 1 1]
[1 1 1 1 1 0]
[1 1 1 1 0 1]
[1 1 1 0 0 0]
[1 1 1 0 1 0]
[1 1 1 0 0 0]]
result
数组已经将所有完全被白色(以1表示)包围的“黑色”像素(这里用0表示)在8个方向上进行了更改,即使在角落和边缘也是如此。4年后,我遇到了一个类似的任务,需要去除单像素噪声。
OpenCV的 Camera Calibration 模块中的 filterspeckles 函数非常适用于这个任务。
代码:
import cv2
import numpy as np
data = np.array([[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0],
[1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0],
[1, 0, 1, 0, 1, 0],
[1, 0, 0, 0, 0, 0]]).astype(np.uint8)
print('Input')
print(data)
cv2.filterSpeckles(data, 0, 1, 1)[0]
print('Output')
print(data)
Input
[[1 1 1 1 1 1]
[1 1 1 1 1 0]
[1 0 0 0 0 1]
[1 0 1 0 0 0]
[1 0 1 0 1 0]
[1 0 0 0 0 0]]
Output
[[1 1 1 1 1 1]
[1 1 1 1 1 0]
[1 0 0 0 0 0]
[1 0 1 0 0 0]
[1 0 1 0 0 0]
[1 0 0 0 0 0]]