本地二进制模式中出现意外行为 - python skimage

时间:2017-02-19 00:50:01

标签: python image-processing scikit-image lbph-algorithm

我最近遇到的问题是python skimage中的本地二进制模式方法产生了意想不到的结果。

看看下面的卡通示例。它在平面彩色背景上显示两个扁平的彩色圆圈。

circles

本地二进制模式(P = 8个样本,Radius = 1)输出为:

lbp

(图像以喷墨颜色编码)。灰色正确表示255. 但是,蓝色为85(二进制01010101)

因此,当方法正确地将背景和右侧的圆圈显示为255时,它将左侧圆圈显示为85.显然,skimage中的局部二元模式方法认为该区域完全是噪声(因此交替的二进制模式01010101 )。然而,事实并非如此,因为我仔细检查了上面蓝色区域中的各个像素,它们的值是相同的(即它的平面颜色,就像平面颜色背景和其他平面颜色圆圈一样)。

之前有没有人遇到过类似的问题?

如果您想要复制此代码,请输入以下代码:

from skimage.feature import local_binary_pattern
from skimage.color import rgb2gray
import matplotlib.pyplot as plt

img = plt.imread('circles.png')
img = rgb2gray(img)

lbp = local_binary_pattern(img, 8, 1, 'default')
plt.imshow(lbp, cmap='nipy_spectral')
plt.title('Standard lbp (8,1)')

1 个答案:

答案 0 :(得分:1)

我猜这个问题是由于数字错误造成的。使用

读取彩色图像时
img = plt.imread('circles.png')

你得到一个float32类型的数组,并在随后转换为灰度

img = skimage.color.rgb2gray(img)

生成的图像属于float64类型。

我建议你避免中间步骤。您可以从一开始就以双精度(即float64)读取图像:

In [63]: from skimage.feature import local_binary_pattern

In [64]: from skimage import io

In [65]: img = io.imread('circles.png', as_grey=True)

In [66]: img.dtype
Out[66]: dtype('float64')

In [67]: lbp = local_binary_pattern(img, 8, 1, 'default')

In [68]: io.imshow(lbp/255., cmap='nipy_spectral')
Out[68]: <matplotlib.image.AxesImage at 0x10bdd780>

results