OpenCV Texture 纹理处理

Texture Analyse 纹理提取

LBP

一种常用的纹理提取方法是LBP(Local Binary Pattern),它是一种描述图像特征像素点与各个像素点之间的灰度关系的局部特征的非参数算法.

灰度不变性基本LBP算法通过用一个8-bit数表示像素点与周围8个像素点之间灰度大小关系,能够将具有相同灰度变化趋势的区域用同样的颜色表示出来,从来显示出图像的纹理特征.

可以使用Python的skimage库中的local_binary_pattern()函数方便地实施LBP

这里我们使用比较原始的方法对每个像素进行检测

程序代码

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#! /usr/local/bin/python
# -*- coding: UTF-8 -*-
import cv2
import numpy as np
infmg=cv2.imread("woods.png",1)# flags>0,以BGR格式读入,忽略透明度的channel
cv2.imshow("Original",infmg)# 显示图像
grayimg=cv2.cvtColor(infmg,cv2.COLOR_BGR2GRAY)# 转换为灰度图像
cv2.imshow("Gray Image",grayimg)# 显示图像
rows,cols,channels=infmg.shape# 获取图像尺寸及通道(BGR三通道)
lbpmem=np.zeros((rows,cols,1),np.uint8)# 新建存储纹理的灰度图像
tmp=np.zeros((8,1,1),np.uint8)# 存储8-bit值
# 图像最边缘一周的像素不具有8个neighbor,忽略
# 依次确定像素边缘一周的取值
for i in range(1,rows-1):
for j in range(1,cols-1):
if(grayimg[i,j]<grayimg[i-1,j-1]):
tmp[0]=1
else:
tmp[0]=0
if(grayimg[i,j]<grayimg[i-1,j]):
tmp[1]=1
else:
tmp[1]=0
if(grayimg[i,j]<grayimg[i-1,j+1]):
tmp[2]=1
else:
tmp[2]=0
if(grayimg[i,j]<grayimg[i,j+1]):
tmp[3]=1
else:
tmp[3]=0
if(grayimg[i,j]<grayimg[i+1,j+1]):
tmp[4]=1
else:
tmp[4]=0
if(grayimg[i,j]<grayimg[i+1,j]):
tmp[5]=1
else:
tmp[5]=0
if(grayimg[i,j]<grayimg[i+1,j-1]):
tmp[6]=1
else:
tmp[6]=0
if(grayimg[i,j]<grayimg[i,j-1]):
tmp[7]=1
else:
tmp[7]=0
# 计算灰度值
lbpmem[i,j]=tmp[7]*128+tmp[6]*64+tmp[5]*32+tmp[4]*16+tmp[3]*8+tmp[2]*4+tmp[1]*2+tmp[0]
# print(lbpmem)
cv2.imshow("LBP Image",lbpmem)
cv2.waitKey(0) #关闭窗口/键盘ESC退出
cv2.destroyAllWindows()

运行结果

原始图像

灰度图像

LBP图像

边缘提取

可以使用Python的skimage库中的filters.sobel()函数方便地进行边缘提取

Texture Synthesis 纹理合成

通常采用Deep Learning能够取得比较好的效果,这块我暂时没有时间深入地进行学习,所以暂时略过

Texture Transfer 纹理迁移

主要步骤:

  • 选择目标区域:
    1. 颜色检测
    2. 灰度检测
    3. 纹理检测
    4. 边缘检测
  • 确定纹理迁移方法:
    1. 直接替换
    2. 有条件替换
    3. 直接合成
    4. 有条件合成
0%