我怎么能从mahotas中的图像和python中的opencv中减去背景?

时间:2014-01-16 02:49:32

标签: opencv image-processing mahotas

我有许多像this或类似this的图像,我使用此代码:

fork = mh.imread(path)
bin = fork[:,:,0]
bin = mh.erode(bin)
bin = (bin < 80)

第二张图片,但我必须使用它:

bin = (bin < 127)

为第一个。

有一种方法可以自动获得没有背景的好图像,或者我必须选择一个中值,希望对我的大部分图像都有好处吗?

2 个答案:

答案 0 :(得分:1)

有一个名为“Otsu Threshold”的阈值。 Here您有更多信息。

您可以使用otsu在Mahotas中执行此操作,或使用threshold_otsu中的scikit-image执行此操作:

fork = mh.imread(path)
bin = fork[:,:,0]
thresh = mh.otsu(bin)
binary =( bin< thresh)

答案 1 :(得分:0)

我知道你想要将白色背景与图像分开。 以下是执行此操作的步骤。我会用简单的英语写,因为我不熟悉python。

1:计算图像的关闭(扩张和侵蚀的应用)。使用尺寸为5x5的正方形结构元素进行膨胀和侵蚀。

C = mh.dilate(bin)
C = mh.erode(C);

这将为您提供背景

2:从原始图像中减去背景:

C = C-bin

这将为您提供白色涂漆的星形图像,背景为黑色

3:现在计算二值化的自动阈值。使用简单的Otsu技术来估计最佳阈值。在openCV中,这类似于:

double thresh = cv::threshold(im,im,0,255,CV_THRESH_BINARY | CV_THRESH_OTSU);
cv::threshold(im,im,thresh,255,CV_THRESH_BINARY_INV);

这将为您的图像提供完美的效果。 不要试图猜测阈值。对于您的图像,它不是80而不是127。使用Otsu