Python으로 이미지에서 텍스처 분석(Texture Analysis) 및 특징 추출

컴퓨터 비전 분야에서 **텍스처 분석(Texture Analysis)**은 이미지의 시각적 패턴을 이해하고,
물체나 환경을 식별하는 데 중요한 역할을 합니다.
텍스처는 색상과 형태뿐 아니라 표면의 반복적 패턴과 구조적 특징을 포함하며,
산업용 검사, 의료 영상 분석, 원격 탐사, 예술 이미지 분석 등 다양한 분야에서 활용됩니다.
이번 글에서는 Python과 OpenCV, Scikit-image, NumPy를 활용하여
이미지 텍스처를 분석하고 특징 벡터를 추출하는 방법을 단계별로 살펴보겠습니다.
텍스처 분석(Texture Analysis)이란?
텍스처 분석은 이미지 내 규칙적, 비규칙적 패턴을 수치화하여
컴퓨터가 인식할 수 있도록 만드는 과정입니다.
주요 목적은 다음과 같습니다.
- 물체 식별(Object Recognition) – 텍스처 기반 분류
- 표면 결함 검출(Defect Detection) – 산업용 검사
- 환경 모니터링(Environmental Monitoring) – 산림, 토양, 수면 상태 분석
- 이미지 분할(Image Segmentation) – 텍스처 영역 구분
텍스처는 주로 다음과 같은 특성으로 정의됩니다.
- Coarseness(거칠기)
- Contrast(대비)
- Directionality(방향성)
- Regularity(규칙성)
이러한 특성을 수치화하면 기계 학습 모델과 결합하여 정밀 분석이 가능합니다.
Python 환경 구성과 필수 라이브러리
텍스처 분석을 위해 필요한 Python 라이브러리는 다음과 같습니다.
pip install opencv-python scikit-image numpy matplotlib
- OpenCV: 이미지 읽기, 전처리, 필터링
- Scikit-image: 텍스처 특성 추출, 필터, GLCM 등
- NumPy: 배열 연산 및 데이터 처리
- Matplotlib: 분석 결과 시각화
이 조합을 통해 텍스처 분석과 특징 추출, 시각화까지 일관된 워크플로우를 구축할 수 있습니다.
이미지 전처리(Image Preprocessing)
이미지 텍스처 분석을 시작하기 전에, 전처리 과정을 통해 노이즈를 줄이고 분석 정확도를 높여야 합니다.
- 그레이스케일 변환 – 텍스처 분석은 주로 밝기 값 기반
import cv2
import numpy as np
img = cv2.imread('sample_texture.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- 노이즈 제거 – Gaussian Blur, Median Filter 등
blur = cv2.GaussianBlur(gray, (5,5), 0)
- 이미지 정규화 – 값 범위를 0~1로 변환
normalized = blur / 255.0
전처리를 통해 잡음과 조명 변화에 영향을 덜 받는 특징 벡터를 얻을 수 있습니다.
텍스처 특징 추출(Feature Extraction)
텍스처 분석에서 핵심은 GLCM(Gray Level Co-occurrence Matrix) 기반의 특징 추출입니다.
GLCM은 픽셀 간의 밝기 관계를 수치화하여 텍스처를 표현합니다.
from skimage.feature import greycomatrix, greycoprops
# GLCM 생성
glcm = greycomatrix((normalized*255).astype('uint8'), distances=[1,2,4], angles=[0, np.pi/4, np.pi/2, 3*np.pi/4], levels=256, symmetric=True, normed=True)
# 주요 텍스처 특성 추출
contrast = greycoprops(glcm, 'contrast')
dissimilarity = greycoprops(glcm, 'dissimilarity')
homogeneity = greycoprops(glcm, 'homogeneity')
energy = greycoprops(glcm, 'energy')
correlation = greycoprops(glcm, 'correlation')
- Contrast: 이미지 밝기 차이 정도
- Dissimilarity: 서로 다른 값의 픽셀 빈도
- Homogeneity: 지역적 균일성
- Energy: 텍스처 규칙성
- Correlation: 픽셀 간 상관 관계
이러한 벡터를 결합하면 이미지의 텍스처를 정량적으로 표현할 수 있습니다.
필터 기반 텍스처 분석
GLCM 외에도 필터 기반 텍스처 분석 방법이 있습니다.
- Gabor Filter – 방향성과 주파수 기반 필터링
import cv2
import numpy as np
kernel = cv2.getGaborKernel((21,21), 5, np.pi/4, 10, 0.5, 0, ktype=cv2.CV_32F)
filtered_img = cv2.filter2D(normalized, cv2.CV_8UC3, kernel)
- Laws Texture Energy – 에너지 기반 텍스처 측정
- Local Binary Patterns (LBP) – 지역적 패턴 인식, 분류에 유용
필터를 적용하면 이미지 내 특정 방향성, 반복 패턴, 구조를 강조할 수 있으며,
특히 산업용 결함 탐지나 재료 표면 분석에 강력합니다.
텍스처 기반 분류 및 응용
추출된 텍스처 특징을 활용하면, 이미지 분류와 패턴 인식이 가능합니다.
예를 들어 머신러닝 모델을 사용하면 다음과 같은 응용이 가능합니다.
- 산업 검사: 금속, 섬유, 목재 표면 결함 자동 검출
- 의료 영상: 조직 특성 분석, 암 조직 탐지
- 농업/환경 모니터링: 토양 유형 분류, 식생 상태 분석
- 원격 탐사: 도시, 산림, 수체 영역 구분
from sklearn.ensemble import RandomForestClassifier
X = np.array([contrast.flatten(), homogeneity.flatten(), energy.flatten()]).T
y = labels # 이미지에 대한 라벨
clf = RandomForestClassifier()
clf.fit(X, y)
predictions = clf.predict(X_test)
텍스처 기반 분석은 단순한 색상이나 형태보다 복잡한 구조와 패턴을 포착하기 때문에,
정밀한 이미지 분류와 이상 탐지에 특히 효과적입니다.
텍스처 분석 시 고려 사항
- 조명과 스케일 – 조명 변화와 이미지 확대/축소에 민감하므로 전처리 필요
- 노이즈 – 필터링과 정규화로 영향을 최소화
- 특징 선택 – GLCM, Gabor, LBP 등 목적에 맞는 특징 선택
- 연산 효율 – 대용량 이미지 분석 시 병렬 처리 고려
결론
Python을 활용한 이미지 텍스처 분석과 특징 추출은
산업용 검사, 의료 영상, 원격 탐사, 환경 모니터링 등 다양한 분야에서 강력한 도구입니다.
OpenCV와 Scikit-image를 통해 전처리, GLCM, 필터 기반 분석, LBP 등 다양한 기법을 구현할 수 있으며,
추출된 특징 벡터는 머신러닝 및 딥러닝 모델과 결합하여 자동 분류와 결함 탐지에 활용할 수 있습니다.
앞으로 텍스처 분석은 AI와 결합하여 더욱 정밀하고 실시간 분석이 가능해지며,
산업 및 연구 환경에서 필수적인 컴퓨터 비전 기술로 자리잡을 것입니다.