通过阈值提取前景图像作为掩码
Extracting foreground image as mask by thresholding
我正在寻找一种可靠的方法来从背景中有一些噪声的图像中提取前景。
所以,我想使用它的图像是:
我的尝试是使用 Otsu thresholding
。我在 Python 中做了如下操作:
from skimage.filter import threshold_otsu
import os.path as path
import matplotlib.pyplot as plt
img = io.imread(path.expanduser('~/Desktop/62.jpg'))
r_t = threshold_otsu(img[:, :, 0])
g_t = threshold_otsu(img[:, :, 1])
b_t = threshold_otsu(img[:, :, 2])
m = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
mask = (img[:, :, 0] < r_t) & (img[:, :, 1] < g_t) & (img[:, :, 2] < b_t)
m[~mask] = 255
plt.imshow(m)
plt.show()
这样给出的R、G、B阈值为(62 67 64),有点高。结果是:
这张图片也是 Otsu thresholding
效果最好的图片之一。如果我使用 30 之类的手动阈值,效果会很好。结果是:
我想知道我是否应该尝试其他一些方法。分割真的不是我的专业领域,我能做的开箱即用似乎有限。
您的图片看起来色彩不是很丰富。所以你可以对灰度值进行分割,而不是对每个颜色单独进行分割,然后组合三个蒙版。
查看包 scikit-image.filter
还有其他几种阈值方法。我尝试了所有这些并发现 threshold_isodata
表现非常好,给出的图像几乎与您想要的图像相同。所以我推荐isodata算法。
示例:
import numpy as np
import skimage.io as io
import skimage.filter as filter
import matplotlib.pyplot as plt
img = io.imread('62.jpg')
gray = np.sum(img, axis=2) # summed up over red, green, blue
#threshold = filter.threshold_otsu(gray) # delivers very high threshold
threshold = filter.threshold_isodata(gray) # works extremely well
#threshold = filter.threshold_yen(gray) # delivers even higher threshold
print(threshold)
plt.imshow(gray > threshold)
plt.show()
给出:
我正在寻找一种可靠的方法来从背景中有一些噪声的图像中提取前景。
所以,我想使用它的图像是:
我的尝试是使用 Otsu thresholding
。我在 Python 中做了如下操作:
from skimage.filter import threshold_otsu
import os.path as path
import matplotlib.pyplot as plt
img = io.imread(path.expanduser('~/Desktop/62.jpg'))
r_t = threshold_otsu(img[:, :, 0])
g_t = threshold_otsu(img[:, :, 1])
b_t = threshold_otsu(img[:, :, 2])
m = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
mask = (img[:, :, 0] < r_t) & (img[:, :, 1] < g_t) & (img[:, :, 2] < b_t)
m[~mask] = 255
plt.imshow(m)
plt.show()
这样给出的R、G、B阈值为(62 67 64),有点高。结果是:
这张图片也是 Otsu thresholding
效果最好的图片之一。如果我使用 30 之类的手动阈值,效果会很好。结果是:
我想知道我是否应该尝试其他一些方法。分割真的不是我的专业领域,我能做的开箱即用似乎有限。
您的图片看起来色彩不是很丰富。所以你可以对灰度值进行分割,而不是对每个颜色单独进行分割,然后组合三个蒙版。
查看包 scikit-image.filter
还有其他几种阈值方法。我尝试了所有这些并发现 threshold_isodata
表现非常好,给出的图像几乎与您想要的图像相同。所以我推荐isodata算法。
示例:
import numpy as np
import skimage.io as io
import skimage.filter as filter
import matplotlib.pyplot as plt
img = io.imread('62.jpg')
gray = np.sum(img, axis=2) # summed up over red, green, blue
#threshold = filter.threshold_otsu(gray) # delivers very high threshold
threshold = filter.threshold_isodata(gray) # works extremely well
#threshold = filter.threshold_yen(gray) # delivers even higher threshold
print(threshold)
plt.imshow(gray > threshold)
plt.show()
给出: