基于Gabor纹理特征与K-means聚类的图像分割(Matlab实现)

一、算法原理与流程

本方案结合Gabor滤波器 的纹理特征提取能力和K-means聚类的无监督分类特性,实现图像分割。核心流程如下:

  1. 图像预处理:灰度化、归一化。
  2. Gabor滤波器组设计:多方向、多尺度的Gabor滤波器生成。
  3. 纹理特征提取:对每个滤波器输出进行高斯平滑。
  4. 特征融合:添加空间坐标信息,构建高维特征向量。
  5. K-means聚类:基于特征向量对像素进行聚类。
  6. 可视化:将聚类结果映射为分割图像。

二、关键步骤实现(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

四、改进与优化
  1. 多尺度特征增强: 增加Gabor滤波器的波长范围(如从2到图像最大边长),捕捉更多尺度纹理。

  2. 方向优化: 使用更细粒度的方向采样(如步长15°),提升对复杂纹理的区分能力。

  3. 特征选择

    通过主成分分析(PCA)降维,保留主要特征分量,减少计算量:

    matlab 复制代码
    [coeff, score] = pca(X);
    X_reduced = score(:, 1:10); % 保留前10个主成分
  4. 动态聚类数目

    使用肘部法则(Elbow Method)自动确定最佳聚类数目:

    matlab 复制代码
    silhouetteScores = 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

五、应用场景
  1. 自然场景分割: 分离草地、天空、建筑物等不同纹理区域(如示例中的狗与浴室地板分割)。
  2. 工业检测: 识别产品表面缺陷(如划痕、裂纹),通过纹理异常实现缺陷定位。
  3. 医学图像分析: 分割CT/MRI图像中的器官组织,利用不同组织的纹理特性进行区分。

六、注意事项
  1. 计算效率: Gabor滤波器组和K-means聚类计算量大,建议对大图像分块处理或使用GPU加速。
  2. 噪声敏感度: 若图像噪声严重,需在滤波前增加去噪步骤(如非局部均值去噪)。
  3. 参数调优: 通过交叉验证调整波长、方向数量及高斯平滑参数,避免过拟合或欠拟合。

七、完整代码示例
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('分割结果');

八、参考文献
  1. Image Processing Toolbox™官方示例:基于Gabor滤波的纹理分割

  2. CSDN博客:Gabor滤波器与K-means结合的分割方法

  3. MATLAB文档:imsegkmeans函数详解

  4. IEEE论文:Gabor特征在纹理分割中的应用

相关推荐
你怎么知道我是队长3 小时前
C语言---枚举变量
c语言·开发语言
李慕婉学姐3 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫3 小时前
quecpython中&的具体含义和使用场景
开发语言·python
云栖梦泽3 小时前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
数据大魔方4 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
Edward.W5 小时前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer5 小时前
Python字符串
开发语言·数据库·python
月疯5 小时前
各种信号的模拟(ECG信号、质谱图、EEG信号),方便U-net训练
开发语言·python
荒诞硬汉5 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国6 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos