本地二进制模式中的意外行为 - python skimage
Unexpected behavior in local binary pattern - python skimage
我最近 运行 遇到了 python skimage 中的局部二元模式方法产生意外结果的问题。
看看下面的卡通例子。它在单色背景上显示两个单色圆圈。
局部二进制模式(P=8 个样本,半径=1)输出为:
(图像以喷射颜色进行颜色编码)。灰色正确表示 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)')
我猜这个问题是由于数字错误造成的。使用
读取彩色图像时
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>
我最近 运行 遇到了 python skimage 中的局部二元模式方法产生意外结果的问题。
看看下面的卡通例子。它在单色背景上显示两个单色圆圈。
局部二进制模式(P=8 个样本,半径=1)输出为:
(图像以喷射颜色进行颜色编码)。灰色正确表示 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)')
我猜这个问题是由于数字错误造成的。使用
读取彩色图像时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>