opencv 纹理检测
时间: 2025-01-08 18:52:22 浏览: 46
使用 OpenCV 进行纹理检测
1. 光度立体法简介
光度立体法是一种用于从多个不同光照条件下的图像中恢复物体表面形状的技术。这种方法可以有效地检测到表面上的小突起、凹陷和其他细微结构变化,非常适合于纹理分析和缺陷检测[^3]。
2. 准备工作
为了应用光度立体法进行纹理检测,首先需要准备一组在同一视角下拍摄但在不同方向上均匀照明的照片。这些照片应该覆盖整个感兴趣区域,并且最好是在受控环境中获取以减少其他因素的影响。
3. 图像预处理
在开始之前,可能还需要对原始图片做一些基本的预处理操作来提高后续计算的效果。这通常包括但不限于灰度转换、噪声去除以及对比度增强等步骤:
import cv2
import numpy as np
def preprocess_image(image_path):
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 去噪
denoised_img = cv2.fastNlMeansDenoising(img)
# 对比度拉伸
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
enhanced_img = clahe.apply(denoised_img)
return enhanced_img
4. 计算表面法线向量场
通过多张带有不同光源角度照射得到的图像集合作为输入数据源,利用最小二乘估计或其他优化算法求解每一点处的最佳拟合平面方程系数,进而获得该位置对应的单位法矢量( \hat{n}=[n_x,n_y,n_z]^T) 。具体实现方式取决于实际应用场景的要求和技术细节。
5. 特征提取与分类
一旦获得了完整的三维法线图之后,则可以根据特定需求定义某些特征指标来进行进一步处理;比如对于皮革这类材料来说,可以通过统计局部区域内各个像素点之间高度差值分布情况作为衡量标准之一,以此区分正常部分和平滑程度异常之处即所谓的“瑕疵”。
from skimage.feature import local_binary_pattern
def extract_texture_features(normal_map):
radius = 3
n_points = 8 * radius
lbp = local_binary_pattern(normal_map[:, :, 0], n_points, radius, method='uniform')
hist, _ = np.histogram(lbp.ravel(), bins=np.arange(n_points + 3), density=True)
return hist
相关推荐


















