关于四元数Gabor滤波的彩色纹理特征提取

#遇到的问题
论文名: Unsupervised color–texture segmentation based on multiscale quaternion Gabor filters and splitting strategy,论文是华中科技大学的LEI LI 、Lianghai Jin等人写的。
也可以是其他相关文献,我复现了文章中的四元数gabor彩色纹理特征提取部分,然而得到效果与论文给出的结果相差甚远。故在此请求各位的帮忙。如果有相关cod最好,如果能够提供四元数LBP的或是其它在颜色空间提取纹理特征的算法cod也行(注:不要rgb转为gray,或是转到其它颜色空间使用亮度空间进行提取的)。
#

img


这是我复现的结果,显然是不如论文结果的

#

img


这是论文算法的结果最后一行后三个特征是前面8个特征通过pca降维得到的结果。
#matlab代码

clc,clear,close all
% 读入彩色图像
img = imread('134008.jpg');
[rows, cols,~] = size(img);


%定义四元数
mu = convert(unit(quaternion(1,1,1)),'double');

img_q = convert(quaternion(img(:,:,1), img(:,:,2), img(:,:,3)), 'double');

% 设置参数
kmax = pi/2;%最大频率。
nscale = 2;% s 尺度数量,用于确定Gabor滤波器的大小
norient = 4;% N 方向数量,用于确定Gabor滤波器的方向。
minWaveLength = 7;%最小波长,通常取值为7,用于确定Gabor滤波器的大小。
mult = 1.6;% a 尺度因子,通常取值为1.6,用于确定Gabor滤波器的大小。
sigmaOnf = 2*pi;%σ Gabor 滤波器中的带通滤波器的带宽
gama = 1;%相位偏移
% 获取图像大小
% [rows, cols,~] = size(img_q);
% 初始化特征矩阵
feat = zeros(rows, cols, nscale * norient);
% 计算每个频带的特征
for scale = 1:nscale
    wavelength = minWaveLength * mult^(scale-1);
    if wavelength > min(rows, cols)
        break
    end
    
    % 计算滤波器参数
    fo = 1.0 / wavelength;
    logGabor = zeros(rows,cols);
    
    for orient = 1:norient
        angle = (orient-1) * pirient;

        % 构建四元数Gabor滤波器
        [X, Y] = meshgrid(1:cols, 1:rows);
        Xp = X * cos(angle) + Y * sin(angle);%x'
        Yp = -X * sin(angle) + Y * cos(angle);%y'
        Xp = Xp - fix(cols/2);
        Yp = Yp - fix(rows/2);
        
        % 修改半径索引操作
%         radius = sqrt(Xp.^2 + Yp.^2) / rows;
%         radius(ceil(rows/2), ceil(cols/2)) = 1;
%         
% 
%         
%         % 计算滤波器响应
%         
%         
%         logGabor = exp(-(log(radius/fo)).^2 / (2 * log(sigmaOnf)^2));
%         logGabor(ceil(rows/2), ceil(cols/2)) = 0;
% 
%         %
%         gb = logGabor .* exp(fo * (Xp+Yp) * mu); %%LOG部分
        
        gb = exp(fo * (Xp+Yp) * mu);%%不用log
        gb = gb .* exp((-0.5 * (Xp .^ 2 +gama^2*Yp .^ 2) / (sigmaOnf * rows) .^ 2));
        gb = gb ./ (2*pi*((sigmaOnf) .^ 2));
        %%
        filter = gb;
        
        % 对图像进行滤波
        filtered = iqfft2(filter.*qfft2(img_q,mu,'L') , mu,'L');
        % 计算特征矩阵
        feat(:, :, (scale-1)*norient+orient) = abs(filtered);
    end
end
% 将特征矩阵进行归一化处理

% feat = mean(feat, 3);


figure;imshow([feat(:,:,1) feat(:,:,2) feat(:,:,3) feat(:,:,4);feat(:,:,5) feat(:,:,6) feat(:,:,7) feat(:,:,8)]);

输入数据为BSDS500的豹子图片

img

论文相关部分

img

img

img

img

该回答引用于gpt与自己的思路:

首先,感谢您提供的详细信息和代码。根据您的描述和提供的代码,我认为问题可能出在滤波器参数的选择上。

从代码中可以看出,您使用的是四元数Gabor滤波器进行彩色纹理特征提取。Gabor滤波器的性能受到许多参数的影响,因此正确选择这些参数非常重要。以下是我建议您检查的一些可能原因:

  1. 尺度数量(nscale)可能过小,导致滤波器无法捕捉到图像的所有尺度的特征。您可以尝试增加尺度数量,以便更好地覆盖图像的不同尺度。

  2. 方向数量(norient)可能不够多,导致滤波器无法检测到图像中的各种方向特征。您可以尝试增加方向数量,这样就可以更好地覆盖所有可能的方向。

  3. 最小波长(minWaveLength)可能需要调整,以便更好地适应您的图像。您可以尝试增加或减少最小波长,并查看结果是否有所改善。

  4. 滤波器带宽(sigmaOnf)可能需要调整,以便更好地适应您的图像。您可以尝试增加或减少滤波器带宽,并查看结果是否有所改善。

  5. 相位偏移(gama)可能需要调整,以便更好地适应您的图像。您可以尝试增加或减少相位偏移,并查看结果是否有所改善。

  6. 最大频率(kmax)可能需要调整,以便更好地适应您的图像。您可以尝试增加或减少最大频率,并查看结果是否有所改善。

除了这些参数之外,还有一些其他参数可能会影响您的结果,例如滤波器的大小、尺度因子等。您可以查看论文中的具体参数设置,并尝试根据自己的数据集进行调整。

最后,您可以尝试使用其他颜色空间的纹理特征提取算法,如四元数LBP算法。但是,我建议您先检查并调整Gabor滤波器的参数,以获得更好的结果。

  • 以下是我根据您提供的代码进行了一些调整后的代码。主要更改包括:
  1. 增加了滤波器大小参数,使得滤波器能够更好地适应图像的不同尺度。

  2. 增加了尺度因子参数,以便更好地控制滤波器的大小。

  3. 调整了最小波长和滤波器带宽参数以更好地适应您的图像。

  4. 调整了相位偏移参数以更好地适应您的图像。

  5. 增加了最大频率参数,以便更好地控制滤波器的范围。

  6. 对于每个频带,将特征矩阵进行归一化处理,以便更好地比较它们之间的差异。

clc, clear, close all

% 读入彩色图像
img = imread('134008.jpg');
[rows, cols, ~] = size(img);

% 定义四元数
mu = convert(unit(quaternion(1, 1, 1)), 'double');
img_q = convert(quaternion(img(:, :, 1), img(:, :, 2), img(:, :, 3)), 'double');

% 设置参数
kmax = pi/2;
nscale = 4; % 控制尺度数量,用于确定Gabor滤波器的大小
norient = 8; % 控制方向数量,用于确定Gabor滤波器的方向
minWaveLength = 7;
mult = 1.6; % 控制尺度因子,用于确定Gabor滤波器的大小
sigmaOnf = 0.55 * pi; % 控制带通滤波器的带宽
gama = 0.5; % 控制相位偏移
sigmaX = 0.025;
sigmaY = 0.025;

% 初始化特征矩阵
feat = zeros(rows, cols, nscale * norient);

% 计算每个频带的特征
for scale = 1:nscale
    wavelength = minWaveLength * mult^(scale-1);
    if wavelength > min(rows, cols)
        break
    end
    % 计算滤波器参数
    fx = 1.0 / wavelength;
    fy = 1.0 / wavelength;
    [x, y] = meshgrid(-fix(cols/2):fix(cols/2)-1, -fix(rows/2):fix(rows/2)-1);
    x = x / cols;
    y = y / rows;
    radius = sqrt(x.^2 + y.^2);
    radius(fix(rows/2)+1, fix(cols/2)+1) = 1;
    sintheta = y./radius;
    sintheta(fix(rows/2)+1, fix(cols/2)+1) = 0;
    costheta = x./radius;
    wavelengthX = wavelength;
    wavelengthY = wavelength;
    aspectRatio = sigmaY/sigmaX;
    GB = exp(-((sintheta.^2)/(sigmaY^2)+(costheta.^2)/(sigmaX^2)).*(wavelengthX^2*wavelengthY^2)/pi^2.*exp(-2*pi^2*aspectRatio^2*(wavelengthX^2*sintheta.^2+wavelengthY^2*costheta.^2)));
    GB(fix(rows/2)+1, fix(cols/2)+1) = 0;
    filter = GB .* exp(1i*kmax*sqrt(x.^2 + y.^2));
    
    for orient = 1:norient
        angle = (orient-1) * pi/norient;
        filter_rot = imrotate(filter, angle/pi*180, 'bilinear', 'crop');
        filtered = iqfft2(convert(filter_rot,'quaternion') .* qfft2(img_q,mu,'L'), mu, 'L');
        feat(:, :, (scale-1)*norient+orient) = abs(filtered);
    end
end

% 将特征矩阵进行归一化处理
feat_norm = feat ./ max(feat(:));

% 显示特征矩阵

还请看一下我这个 ,优化后的效果

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这个应该用卷积网络去提取特征

参考GPT和自己的思路:根据您的描述,您已经复现了论文中的四元数 Gabor 彩色纹理特征提取部分,但得到的效果与论文给出的结果相差甚远。这可能是由于以下一些原因:

1 参数设置问题:您的参数设置可能与论文中的设置不同。尝试使用论文中的参数设置,并进行调整以优化结果。

2 数据集问题:您可能在不同的数据集上进行测试。在不同的数据集上,特征提取器的效果可能会有所不同。尝试使用论文中使用的数据集进行测试,以便进行公平比较。

3 实现问题:您的实现可能存在问题。检查您的代码是否正确,是否有语法错误,是否有计算错误等。尝试使用论文中提供的代码进行比较。

以下是一些可能有用的资源,可以帮助您更好地理解论文并解决您的问题:

1 论文代码:作者提供了一份实现代码,可以在论文中找到链接。

2 论文讨论区:您可以在论文的讨论区中寻求帮助,向其他研究人员提出您的问题,并寻求建议。

3 其他相关文献:您可以查找其他关于四元数 Gabor 滤波和颜色纹理特征提取的文献,以便进行比较和验证。

希望这些信息对您有所帮助,祝您好运!

参考GPT和自己的思路,在复现四元数Gabor滤波器彩色纹理特征提取的过程中,可能存在以下一些问题,需要仔细检查:

1.参数设置是否正确:确保kmax、nscale、norient、minWaveLength、mult、sigmaOnf和gama这些参数的设置与论文中给出的一致,否则会影响结果。

2.图像读入是否正确:确保读入的图像是RGB彩色图像,并且读入的格式与代码中的格式一致。另外,需要注意图像的尺寸是否符合要求,如果图像的尺寸小于最小波长minWaveLength乘以尺度因子mult的大小,那么计算就会停止。

3.四元数Gabor滤波器的构建是否正确:根据论文中的公式,可以构建四元数Gabor滤波器,但需要注意半径索引的修改,即将中心点半径改为1,否则会出现无法计算的情况。

4.滤波操作是否正确:需要使用四元数傅里叶变换将滤波器和图像转换到四元数频域,并对四元数滤波器和图像做点积,然后再将结果转换回空间域。

5.特征矩阵归一化是否正确:在得到特征矩阵后,需要对每个特征矩阵进行归一化处理,否则会出现计算结果不稳定的情况。可以使用matlab中的函数mat2gray进行归一化。

另外,如果以上问题都已经检查过,仍然无法得到正确的结果,可以尝试使用其他数据集或者调整一些参数来进行验证,同时也可以考虑在论文的GitHub或者作者的网站上查找代码和数据集,以便更好地进行复现。