【问题标题】:Cant display the LBP image after using exposed elbp function in python在python中使用暴露的elbp函数后无法显示LBP图像
【发布时间】:2016-03-03 21:22:58
【问题描述】:

我试图在将 elbp 函数应用于灰度图像后显示一个 lbp 图像,该函数是在 python 的 face 模块中手动公开的。 这是代码:

LBP = cv2.face.elbp(gray_roi,1,8)
cv2.imshow("Face",LBP)

但是,我得到的是一个纯黑色的窗口,而且我注意到cols和rows总是比原始图像小2,这是错误信息:

无法将输入数组从形状 (95,95) 广播到形状 (97,97)

我注意到另一个人问了同样的问题,但使用的是 c++:Unable to display image after applying LBPH (elbp()) operator in opencv 但是我无法理解的是他将图像归一化以适应屏幕渲染范围是什么意思?

这是我的图像的矩阵输出:

print(LBP)

如您所见,像素强度分布是正常的。

这里是实际的elbp function

【问题讨论】:

  • 对不起,这是我第一次提问,不确定格式:(
  • python 函数会这样做很奇怪,但可能它在内部将值存储在 [0-1] 区间中,尝试将图像乘以 255 并查看它是否仍然是黑色
  • 我尝试使用 cv2.normalize(LBP1,LBP1,0,255,cv2.NORM_MINMAX) ,但结果还是一样:(
  • 你还是一无所获?我真的不确定,你必须深入研究这个 elbp 函数文档,看看它的行为如何。除非比我聪明的人知道这一点:)
  • 我对较小尺寸的猜测是:LBP 算法应用掩码,以图像像素为中心。假设蒙版是 3x3 像素大小,在源图像的边缘,该蒙版无法完全应用,因为不存在 3 或 5 个像素(在图像的一侧),因此根本不应用它 - 因此LBP 结果数组少了两行/列 - LBP 输出的左上角给出了原始图像左上角的像素的结果。显然,当您通过指定更大的半径来增加掩码大小时,输出 LBP 结果矩阵将变得更小。

标签: python c++ opencv


【解决方案1】:

@barny 感谢您的详细回复,根据您的解决方案,我将矩阵乘以 64 之类的值,最后我得到了显示的图像,但我不确定为什么我必须乘以一个值才能得到正确的可见图像,不应该在原始的elbp函数中完成吗? 而且,矩阵元素值变得非常大:

这是我从显示的图像中打印出来的直方图的一部分(将值乘以 64):

histogram=scipy.stats.itemfreq(LBP1)
print(histogram)[[    0  1726]

histogram

如果有人可以向我解释为什么我必须乘以这么大的值,那就太好了!

ps:这是我第一次询问堆栈溢出问题,感谢所有试图提供帮助的人!

【讨论】:

  • 文档是否说 elbp 返回可见图像?仅仅因为它返回一个与源图像大小几乎相同的值数组并不意味着什么——这只是 LBP 结果的大小。因此,我认为您必须处理 LBP 结果才能以更人性化的方式对其进行可视化,这并不奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2017-07-14
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多