最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

python教程:将对象掩码应用于LBP计算

XAMPP案例 admin 420浏览 0评论

Apply object mask to LBP calculation

我看到许多文章将lbp应用于基于纹理的图像分类。我只是想知道关于此技术的三件事,我无法从Google找到明确的答案:

  • 该算法如何为周围没有足够邻居像素的图像的边界像素计算lbp。
  • 如果我们有八个相邻像素,则中心像素将具有256个图案(如果使用均匀,则为59个)。但是如果我们增加邻居像素的大小(例如8或10),那么图案的数量也会增加,对吗?在这种情况下,它对直方图计算有何影响?
  • 我们如何仅计算对象的lbp。特别是,如果要比较图像中的对象,则只需计算对象的lbp和直方图。我已经尝试通过将opencv直方图(支持mask和numpy直方图不支持mask)到lbp输出来实现这个想法,但是它不起作用。关于如何根据掩码过滤lbp数组的任何想法,然后我们都可以找到直方图。

谢谢。


  • 边界像素通常会被丢弃(先看看最早提出LBP的研究小组开发的Matlab实现)。在其他实现中(例如,参见Python的scikit-learn),添加了黑色边框。
  • P像素的局部邻域会生成2P-bin直方图。如果设置P = 10,则特征向量将具有1024个分量。
  • 此玩具示例向您展示了如何从LBP直方图计算中过滤出不需要的图像区域:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import numpy as np
    from skimage.feature.texture import local_binary_patternP, R = 8, 1
    dim = 2**P
    img = np.asarray([[5, 5, 5, 5], [5, 99, 100, 5], [5, 5, 5, 5]]], dtype=np.uint8)
    mask = img > 5
    codes = local_binary_pattern(img, P, R)
    hist, _ = np.histogram(codes[mask], bins=np.arange(dim+1), range=(0, dim))

    演示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    In [97]: img
    Out[97]:
    array([[  5,   5,   5,   5],
    [  5,  99, 100,   5],
    [  5,   5,   5,   5]], dtype=uint8)In [98]: codes
    Out[98]:
    array([[ 193.,  241.,  241.,  112.],
    [ 199.,    1.,    0.,  124.],
    [   7.,   31.,   31.,   28.]])In [99]: mask
    Out[99]:
    array([[False, False, False, False],
    [False,  True,  True, False],
    [False, False, False, False]], dtype=bool)

    In [100]: hist
    Out[100]:
    array([1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0], dtype=int32)

EDIT

这是一个更现实的示例,如您在注释中所要求的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import numpy as np
from skimage import io
from skimage.feature.texture import local_binary_pattern
import matplotlib.pyplot as pltP = 8
R = 1
dim = 2**P
h_bins = np.arange(dim+1)
h_range = (0, dim)img = io.imread(‘https://i.stack.imgur.com/6ESoP.png’)
mask = (img > 0)
codes = local_binary_pattern(img, P, R)
h_img, _ = np.histogram(codes.ravel(), bins=h_bins, range=h_range)
h_masked, _ = np.histogram(codes[mask], bins=h_bins, range=h_range)
h_img = h_img/h_img.sum(dtype=np.float)
h_masked = h_masked/h_masked.sum(dtype=np.float)

f, [[ax0, ax1], [ax2, ax3]] = plt.subplots(2, 2)
ax0.imshow(img, cmap=plt.cm.gray)
ax0.axis(‘off’)
ax0.set_title(‘Image’)
ax1.imshow(mask, cmap=plt.cm.gray)
ax1.axis(‘off’)
ax1.set_title(‘Mask’)
ax2.plot(h_img)
ax2.set_title(‘LBP of image’)
ax3.plot(h_masked)
ax3.set_title(‘LBP of ROI’)
plt.show(f)

ez00000003

  • 嗨,Tonechas。感谢您的明确答复。在第3部分中,演示中的遮罩是布尔类型,而实际上,我们根据图像创建的对象遮罩是整数。它们之间有什么大区别吗?我的意思是,在放入numpy直方图函数之前,是否必须将对象掩码转换为boonlean值?
  • 如果可能,您是否有任何类似的真实图像演示。感谢Conchas插槽。
  • 掩码值可以是整数或布尔值
  • 非常感谢Tonechas。

转载请注明:XAMPP中文组官网 » python教程:将对象掩码应用于LBP计算

您必须 登录 才能发表评论!