什么是图像的纹理?

先来看下面一组图片:

image.png

上面每一行图片的共同点有:有一定规则的局部图案+大量局部的不断重复+整个区域大致为均匀的统一体

图像纹理定义:具有一定结构的模式或图像,以缓慢变化或者周期性变化组织近似规则的排列。

纹理单元(texton):
image.png

  • 纹理中有周期性纹理的基本单元;
  • 由局部显著特征组成,如拐角、圆点、端点和交叉等;
  • 对于非周期纹理,很难确定其 texton;
  • 可能有多种尺度的结构纹理。

图像纹理应用:

分类识别 区域分割 纹理合成 空间信息估计
(利用纹理对应区域的变形估计曲面形状 )
image.png image.png image.png

image.png

纹理分析

图像纹理 - 图7

LBP算法

概述

(Local Binary Pattern,局部二值模式)

  • 简介:用来描述图像局部纹理特征的算子
  • 优点:旋转不变性+灰度不变性
  • 由T. Ojala, M.Pietikäinen, 和 D. Harwood 在1994年提出,用于局部纹理特征提取。

原始的LBP算子定义在一个3×3的窗口内,以窗口中心像素为阈值,与相邻的8个像素的灰度值比较,若周围的像素值大于中心像素值,则该位置被标记为1;,否则标记为0。

如此可以得到一个8位二进制数(通常还要转换为10进制,即LBP码,共256种),将这个值作为窗口中心像素点的LBP值,以此来反应这个3×3区域的纹理信息。 示意图如下: image.png

代码实现

  1. import numpy as np
  2. import cv2
  3. def LBP(src):
  4. '''
  5. :param src:灰度图像
  6. :return:
  7. '''
  8. height = src.shape[0]
  9. width = src.shape[1]
  10. dst = src.copy()
  11. lbp_value = np.zeros((1,8), dtype=np.uint8)
  12. neighbours = np.zeros((1,8), dtype=np.uint8)
  13. for x in range(1, width-1):
  14. for y in range(1, height-1):
  15. neighbours[0, 0] = src[y - 1, x - 1]
  16. neighbours[0, 1] = src[y - 1, x]
  17. neighbours[0, 2] = src[y - 1, x + 1]
  18. neighbours[0, 3] = src[y, x - 1]
  19. neighbours[0, 4] = src[y, x + 1]
  20. neighbours[0, 5] = src[y + 1, x - 1]
  21. neighbours[0, 6] = src[y + 1, x]
  22. neighbours[0, 7] = src[y + 1, x + 1]
  23. center = src[y, x]
  24. for i in range(8):
  25. if neighbours[0, i] > center:
  26. lbp_value[0, i] = 1
  27. else:
  28. lbp_value[0, i] = 0
  29. lbp = lbp_value[0, 0] * 1 + lbp_value[0, 1] * 2 + lbp_value[0, 2] * 4 + lbp_value[0, 3] * 8 \
  30. + lbp_value[0, 4] * 16 + lbp_value[0, 5] * 32 + lbp_value[0, 6] * 64 + lbp_value[0, 0] * 128
  31. dst[y, x] = lbp
  32. return dst
  33. src = cv2.imread("/Users/longfeifei/PycharmProjects/ngmachine/pic/2.png")
  34. gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
  35. cv2.imshow("original.jpg", src)
  36. cv2.imshow("gray.jpg", gray)
  37. dst = LBP(gray)
  38. cv2.imshow("result.jpg", dst)
  39. cv2.waitKey(0)
  40. cv2.destroyAllWindows()

课堂作业

1.求一幅图的纹理特征图(LBP)

输入图片 纹理图
image.png res1.png
wgate.jpg res2.png

2.比较三纹理图篇纹理图相似程度(LBP)
**
image.png

解决这一个问题的思路是:得出图片的纹理图(LBP),然后比较纹理图的均值感知哈希值。

代码如下:

  1. import numpy as np
  2. import cv2
  3. def aHash(img):
  4. #缩放为8*8
  5. img = cv2.resize(img, (8, 8), interpolation=cv2.INTER_CUBIC)
  6. #转换为灰度图
  7. #s为像素和初值为0,hash_str为hash值初值为''
  8. s = 0
  9. hash_str = ''
  10. #遍历累加求像素和
  11. for i in range(8):
  12. for j in range(8):
  13. s = s+img[i, j]
  14. #求平均灰度
  15. avg = s/64
  16. #灰度大于平均值为1相反为0生成图片的hash值
  17. for i in range(8):
  18. for j in range(8):
  19. if img[i,j]>avg:
  20. hash_str=hash_str+'1'
  21. else:
  22. hash_str=hash_str+'0'
  23. return hash_str
  24. def LBP(src):
  25. '''
  26. :param src:灰度图像
  27. :return:
  28. '''
  29. height = src.shape[0]
  30. width = src.shape[1]
  31. dst = src.copy()
  32. lbp_value = np.zeros((1,8), dtype=np.uint8)
  33. neighbours = np.zeros((1,8), dtype=np.uint8)
  34. for x in range(1, width-1):
  35. for y in range(1, height-1):
  36. neighbours[0, 0] = src[y - 1, x - 1]
  37. neighbours[0, 1] = src[y - 1, x]
  38. neighbours[0, 2] = src[y - 1, x + 1]
  39. neighbours[0, 3] = src[y, x - 1]
  40. neighbours[0, 4] = src[y, x + 1]
  41. neighbours[0, 5] = src[y + 1, x - 1]
  42. neighbours[0, 6] = src[y + 1, x]
  43. neighbours[0, 7] = src[y + 1, x + 1]
  44. center = src[y, x]
  45. for i in range(8):
  46. if neighbours[0, i] > center:
  47. lbp_value[0, i] = 1
  48. else:
  49. lbp_value[0, i] = 0
  50. lbp = lbp_value[0, 0] * 1 + lbp_value[0, 1] * 2 + lbp_value[0, 2] * 4 + lbp_value[0, 3] * 8 \
  51. + lbp_value[0, 4] * 16 + lbp_value[0, 5] * 32 + lbp_value[0, 6] * 64 + lbp_value[0, 0] * 128
  52. dst[y, x] = lbp
  53. return dst
  54. def cmpHash(hash1,hash2):
  55. n=0
  56. #hash长度不同则返回-1代表传参出错
  57. if len(hash1)!=len(hash2):
  58. return -1
  59. #遍历判断
  60. for i in range(len(hash1)):
  61. #不相等则n计数+1,n最终为相似度
  62. if hash1[i]!=hash2[i]:
  63. n=n+1
  64. return n
  65. src1 = cv2.imread("/Users/longfeifei/PycharmProjects/ngmachine/pic/pic1.png")
  66. src2 = cv2.imread("/Users/longfeifei/PycharmProjects/ngmachine/pic/pic2.png")
  67. src3 = cv2.imread("/Users/longfeifei/PycharmProjects/ngmachine/pic/pic3.png")
  68. gray1 = cv2.cvtColor(src1, cv2.COLOR_BGR2GRAY)
  69. dst1 = LBP(gray1)
  70. gray2 = cv2.cvtColor(src2, cv2.COLOR_BGR2GRAY)
  71. dst2 = LBP(gray2)
  72. gray3 = cv2.cvtColor(src3, cv2.COLOR_BGR2GRAY)
  73. dst3 = LBP(gray3)
  74. hash1=aHash(dst1)
  75. hash2=aHash(dst2)
  76. hash3=aHash(dst3)
  77. n=cmpHash(hash1,hash2)
  78. print('第一张第二张均值哈希算法相似度:'+ str(n))
  79. n=cmpHash(hash2,hash3)
  80. print('第二张第三张均值哈希算法相似度:'+ str(n))
  81. n=cmpHash(hash1,hash3)
  82. print('第一张第三张均值哈希算法相似度:'+ str(n))
  83. cv2.waitKey(0)
  84. cv2.destroyAllWindows()


实验结果:**
image.png
第一张图片与第三张图片的相似度较高。