一、算法原理与流程
本方案结合Gabor滤波器 的纹理特征提取能力和K-means聚类的无监督分类特性,实现图像分割。核心流程如下:
- 图像预处理:灰度化、归一化。
- Gabor滤波器组设计:多方向、多尺度的Gabor滤波器生成。
- 纹理特征提取:对每个滤波器输出进行高斯平滑。
- 特征融合:添加空间坐标信息,构建高维特征向量。
- K-means聚类:基于特征向量对像素进行聚类。
- 可视化:将聚类结果映射为分割图像。
二、关键步骤实现(Matlab代码)
1. 图像预处理
matlab
% 读取图像并转换为灰度图
img = imread('kobi.png'); % 输入图像
img = imresize(img, 0.25); % 缩小图像加速处理
grayImg = rgb2gray(img); % 转换为灰度图
figure; imshow(grayImg); title('原始灰度图');
2. Gabor滤波器组设计
matlab
% 定义Gabor滤波器参数
imageSize = size(grayImg);
numRows = imageSize(1);
numCols = imageSize(2);
wavelengthMin = 4 / sqrt(2); % 最小波长
wavelengthMax = hypot(numRows, numCols); % 最大波长(图像对角线长度)
n = floor(log2(wavelengthMax / wavelengthMin)); % 波长数量
wavelength = 2.^(0:(n-2)) * wavelengthMin; % 波长序列(几何级数)
deltaTheta = 45; % 方向步长(度)
orientation = 0:deltaTheta:(180 - deltaTheta); % 方向序列(0~180度)
% 生成Gabor滤波器组
g = gabor(wavelength, orientation);
3. 纹理特征提取
matlab
% 对灰度图进行Gabor滤波
gabormag = imgaborfilt(grayImg, g); % 输出为复数矩阵(实部+虚部)
% 对每个滤波器结果进行高斯平滑(抑制局部噪声)
for i = 1:numel(g)
sigma = 0.5 * g(i).Wavelength; % 高斯核标准差与波长相关
gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i), 3 * sigma); % 平滑处理
end
4. 特征融合与归一化
matlab
% 构建特征集:Gabor幅度 + 空间坐标
[X, Y] = meshgrid(1:numCols, 1:numRows); % 空间坐标网格
featureSet = cat(3, gabormag, X, Y); % 合并特征(24个Gabor通道 + 2个空间通道)
% 将特征向量展平为矩阵(每行对应一个像素)
[numPoints, numFeatures] = size(featureSet);
X = reshape(featureSet, numPoints, numFeatures);
% 归一化(零均值,单位方差)
X = bsxfun(@minus, X, mean(X));
X = bsxfun(@rdivide, X, std(X));
5. K-means聚类
matlab
% 设置聚类参数
numClusters = 2; % 聚类数目(根据场景调整)
options = statset('MaxIter', 1000, 'Display', 'final'); % 优化参数
% 执行K-means聚类
[idx, centers] = kmeans(X, numClusters, 'Options', options, 'Replicates', 5);
% 将聚类结果重塑为图像尺寸
segmentedImg = reshape(idx, numRows, numCols);
figure; imshow(label2rgb(segmentedImg)); title('K-means分割结果');
6. 可视化优化
matlab
% 将聚类结果与原始图像叠加
segmentedOverlay = label2rgb(segmentedImg, 'jet', 'k', 0.5);
figure; imshowpair(img, segmentedOverlay, 'montage');
title('原始图像与分割结果叠加');
三、关键参数说明
| 参数 | 作用 | 典型值/范围 |
|---|---|---|
wavelength |
控制Gabor滤波器的频率敏感度,波长越长,捕捉低频纹理(如大面积色块) | 几何级数(如4,8,16) |
orientation |
定义滤波器方向,覆盖不同纹理方向(如水平、垂直、对角线) | 0°~180°,步长45° |
sigma(高斯平滑) |
抑制局部噪声,避免小区域噪声干扰 | 3倍波长 |
numClusters |
分割区域数量,需根据图像复杂度调整 | 2~10 |
四、改进与优化
-
多尺度特征增强: 增加Gabor滤波器的波长范围(如从2到图像最大边长),捕捉更多尺度纹理。
-
方向优化: 使用更细粒度的方向采样(如步长15°),提升对复杂纹理的区分能力。
-
特征选择:
通过主成分分析(PCA)降维,保留主要特征分量,减少计算量:
matlab[coeff, score] = pca(X); X_reduced = score(:, 1:10); % 保留前10个主成分 -
动态聚类数目:
使用肘部法则(Elbow Method)自动确定最佳聚类数目:
matlabsilhouetteScores = zeros(1, 10); for k = 2:10 [~, ~, ~, silhouetteScores(k)] = silhouette(X, kmeans(X, k)); end optimalK = find(silhouetteScores == max(silhouetteScores));
参考代码 采用gabor提取出图像纹理特征,最后采用k-means方法聚类进行图像分割 www.youwenfan.com/contentcsp/98030.html
五、应用场景
- 自然场景分割: 分离草地、天空、建筑物等不同纹理区域(如示例中的狗与浴室地板分割)。
- 工业检测: 识别产品表面缺陷(如划痕、裂纹),通过纹理异常实现缺陷定位。
- 医学图像分析: 分割CT/MRI图像中的器官组织,利用不同组织的纹理特性进行区分。
六、注意事项
- 计算效率: Gabor滤波器组和K-means聚类计算量大,建议对大图像分块处理或使用GPU加速。
- 噪声敏感度: 若图像噪声严重,需在滤波前增加去噪步骤(如非局部均值去噪)。
- 参数调优: 通过交叉验证调整波长、方向数量及高斯平滑参数,避免过拟合或欠拟合。
七、完整代码示例
matlab
%% 基于Gabor和K-means的图像分割
clear; clc; close all;
% 读取图像
img = imread('kobi.png');
img = imresize(img, 0.25);
grayImg = rgb2gray(img);
figure; imshow(grayImg); title('原始灰度图');
% Gabor滤波器参数
imageSize = size(grayImg);
wavelengthMin = 4 / sqrt(2);
wavelengthMax = hypot(imageSize);
n = floor(log2(wavelengthMax / wavelengthMin));
wavelength = 2.^(0:(n-2)) * wavelengthMin;
deltaTheta = 45;
orientation = 0:deltaTheta:(180 - deltaTheta);
g = gabor(wavelength, orientation);
% Gabor滤波与平滑
gabormag = imgaborfilt(grayImg, g);
for i = 1:numel(g)
sigma = 0.5 * g(i).Wavelength;
gabormag(:,:,i) = imgaussfilt(gabormag(:,:,i), 3*sigma);
end
% 特征融合
[X, Y] = meshgrid(1:size(grayImg,2), 1:size(grayImg,1));
featureSet = cat(3, gabormag, X, Y);
X = reshape(featureSet, [], size(featureSet,3));
% 归一化与K-means
X = bsxfun(@minus, X, mean(X));
X = bsxfun(@rdivide, X, std(X));
numClusters = 2;
[idx, ~] = kmeans(X, numClusters, 'Replicates', 5);
% 可视化
segmentedImg = reshape(idx, size(grayImg));
figure; imshow(label2rgb(segmentedImg)); title('分割结果');
八、参考文献
-
Image Processing Toolbox™官方示例:基于Gabor滤波的纹理分割
-
CSDN博客:Gabor滤波器与K-means结合的分割方法
-
MATLAB文档:
imsegkmeans函数详解 -
IEEE论文:Gabor特征在纹理分割中的应用