【matlab代码练习16】图像特征分析

1. 利用函数mean2()和std()对灰度图像进行一阶矩、二阶矩、三阶矩的计算

close all; clear all; clc;

I = imread('lena.jpg'); % 读取图像,赋值给J
I = rgb2gray(I); 
K = imadjust(I, [70/255, 160/255], []); % 灰度级调整。将[70 160]的灰度扩展到[0 255],增强图像的对比度
figure;
subplot(121), imshow(I); % 显示原始图像
subplot(122), imshow(K); % 显示对比度增强的图像

[m, n] = size(I); % 求图像I数据矩阵的大小,m表示图像的行,n表示图像的列
mm = round(m/2); % 对m/2取整,round表示四舍五入到最近邻的整数
nn = round(n/2); 

[p, q] = size(K); 
pp = round(p/2); 
qq = round(q/2); 

I = double(I); % 将图像数据类型变为double型
K = double(K); 

colorsum = 0.0; % 给灰度值总和赋0
I_avg = mean2(I); % 求原始图像的一阶矩,一阶矩即是均值
K_avg = mean2(K); % 求对比度增强后的图像的一阶矩
I_std = std(std(I)); % 求原始图像的二阶矩,二阶矩即是方差
K_std = std(std(K)); % 求对比度增强后的图像的二阶矩
for i = 1 : mm
   for j = 1 : nn
      colorsum = colorsum + (I(i,j) - I_avg)^3;  
   end
end
I_ske = (colorsum / (mm*nn))^(1/3); % 求原始图像的三阶矩
colorsum = 0.0; % 重置colorsum
for i = 1 : pp
   for j = 1 : qq
      colorsum = colorsum + (K(i,j) - K_avg)^3;  
   end
end
K_ske = (colorsum / (pp * qq)) ^ (1/3); 


根据颜色特征值分析,颜色一阶矩运行结果显示左图的值小于右图,反映了左图要比右图暗;颜色二阶矩运行结果显示左图的值小于右图,说明了左图的灰度分布比右图灰度分布更均匀;颜色三阶矩指的是偏斜度,即颜色的不对称性,运行结果说明左图偏暗,右图偏亮。

2. 基于颜色特征识别花朵与叶子

close all; clear all; clc; 

I = imread('C:\Users\Administrator\Desktop\hua.jpg'); % 读取彩色图像
figure; 
subplot(221), imshow(I); 

R = I(:, :, 1);  % 红色分量
subplot(222), imshow(R); 

G = I(:, :, 2);  % 绿色分量
subplot(223), imshow(G); 

B = I(:, :, 3);  % 蓝色分量
subplot(224), imshow(B); 

R = double(R);  % 为了计算,将数据类型转换为double类型
G = double(G); 
B = double(B); 

Ravg1 = mean2(R); % 红色分量的均值
Gavg1 = mean2(G); % 绿色分量的均值
Bavg1 = mean2(B); % 蓝色分量的均值

Rstd1 = std(std(R)); % 红色分量的方差
Gstd1 = std(std(G)); % 绿色分量的方差
Bstd1 = std(std(B)); % 蓝色分量的方差

J = imread('C:\Users\Administrator\Desktop\yezi.jpg'); % 读取彩色图像
figure; 
subplot(221), imshow(J); 

R = J(:, :, 1);  % 红色分量
subplot(222), imshow(R); 

G = J(:, :, 2);  % 绿色分量
subplot(223), imshow(G); 

B = J(:, :, 3);  % 蓝色分量
subplot(224), imshow(B); 

R = double(R);  % 为了计算,将数据类型转换为double类型
G = double(G); 
B = double(B); 

Ravg2 = mean2(R); % 红色分量的均值
Gavg2 = mean2(G); % 绿色分量的均值
Bavg2 = mean2(B); % 蓝色分量的均值

Rstd2 = std(std(R)); % 红色分量的方差
Gstd2 = std(std(G)); % 绿色分量的方差
Bstd2 = std(std(B)); % 蓝色分量的方差

     

                   

3. 绘制彩色图像的R、G、B分量的直方图

close all; clear all; clc; 

I = imread('C:\Users\Administrator\Desktop\hua.jpg'); % 读取彩色图像
R = I(:, :, 1); % 提取红色分量
G = I(:, :, 2); % 提取绿色分量
B = I(:, :, 3); % 提取蓝色分量
figure; 
subplot(221), imshow(I); 
subplot(222), imshow(R); 
subplot(223), imshow(G); 
subplot(224), imshow(B); 
figure; 
subplot(221), imhist(I); 
subplot(222), imhist(R); 
subplot(223), imhist(G); 
subplot(224), imhist(B);          



4. 通过函数rgb2hsv()将颜色空间由RGB转换为HSV

    由于RGB颜色空间不符合人对颜色的感知心理,常采用面向视觉感知的HSV颜色模型对HSV空间进行适当量化后再计算其直方图,以减少计算量。

扫描二维码关注公众号,回复: 1800208 查看本文章
close all; clear all; clc; 

I = imread('C:\Users\Administrator\Desktop\hua.jpg'); % 读取彩色图像
hsv = rgb2hsv(I); % 图像由RGB空间变换到hsv空间
h = hsv(:, :, 1); % 提取色调h
s = hsv(:, :, 2); % 提取饱和度s
v = hsv(:, :, 3); % 提取亮度v
h_avg = mean2(h); 
s_avg = mean2(s); 
v_avg = mean2(v);
figure; 
subplot(221), imshow(I); 
subplot(222), imshow(h); 
subplot(223), imshow(s); 
subplot(224), imshow(v); 
figure; 
subplot(221), imhist(I); 
subplot(222), imhist(h); 
subplot(223), imhist(s); 
subplot(224), imhist(v); 



5.计算纹理图像的灰度差分统计特征

close all; clear all; clc; 

J = imread('rice.png'); % 读入纹理图像

if ndims(J) == 3  % 如果读入的图像是彩色图像,则转换为灰度图像
    J = rgb2gray(J); 
else
    J = J; 
end

figure; 
subplot(121), imshow(J); 

A = double(J); % 为了计算的准确性,将数据类型转换为double型
[m, n] = size(A);  % 求矩阵A的大小,赋值给m×n
B = A; 
C = zeros(m, n); % 新建全0矩阵

for i = 1 : m-1
   for j = 1 : n-1
      B(i,j) = A(i+1, j+1); 
      C(i,j) = abs(round(A(i,j) - B(i,j))); 
   end
end

subplot(122), imshow(C, []); 

h = imhist(mat2gray(C)) / (m*n); % 差分图中,每个灰度级出现的概率
mean = 0; % 设初始均值为0
con = 0; % 设初始对比度为0
ent = 0; % 设初始熵为0

% ------- 循环求取均值、对比度、熵 ----------- % 

for i = 1 : 256  % i表示各个灰度级
    mean = mean + (i * h(i)) / 256; % 这是累加的表示方式
    con = con + i * i * h(i); 
    if (h(i) > 0)
       ent = ent -  h(i) * log2(h(i));
    end
end

6.编写并调用自相关函数来对纹理图像进行分析

% ---------- 调用自相关函数zxcor() ---------- % 
close all; clear all; clc; 
f11 = imread('rice.png');  % 读入纹理图像

if ndims(f11) == 3
    f1 = rgb2gray(f11); 
else
    f1 = f11; 
end

f1 = double(f1); 

[m, n] = size(f1); 
D = 20; 

[epsilon, eta, C] = zxcor(f1, D, m, n); 

figure; 
subplot(121), imshow(f1, []);
subplot(122), mesh(epsilon, eta, C); % 显示三维坐标图
xlabel('epsilon'); 
ylabel('eta'); 
zlabel('C'); 

% ---------- 编写自相关函数zxcor() ---------- % 
function [epsilon, eta, C] = zxcor(f, D, m, n)
% ZXCOR 自相关函数
% 输入:
%     f -- 读入的图像数据
%     D -- 偏移距离
%     m,n -- 图像的尺寸数据
% 输出:
%     C -- 图像自相关函数的值
%     epsilon, eta -- 自相关函数C的偏移变量

for epsilon = 1 : D % 循环求解图像f(x,y)与偏离值为D的像素之间的相关值
   for eta = 1 : D
       temp = 0; 
       fp = 0; 
       for x = 1 : m
          for y = 1 : n
             if ( x + epsilon - 1 ) > m | ( y + eta - 1 ) > n
                f1 = 0; 
             else
                 f1 = f(x,y) * f(x + epsilon - 1, y + eta - 1);
             end
             temp = f1 + temp; 
             fp = f(x,y) * f(x,y) + fp; 
          end
       end
       f2(epsilon, eta) = temp; 
       f3(epsilon, eta) = fp; 
       C(epsilon, eta) = f2(epsilon, eta) / f3(epsilon, eta); % 相关值
   end
end

epsilon = 0 : (D - 1); % ε方向的取值范围
eta = 0 : (D - 1);  % η方向的取值范围

end

7.Gabor变换

Fourier变换对信号不能给出在各个局部时间范围内部频谱上的谱信息描述。然而在实际应用中,如图形边缘检测、轮廓提取等位置信息极为重要。因此有Gabor变换产生。Gabor变换属于加窗Fourier变换,Gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外Gabor函数与人眼的生物作用相仿,所以经常用于纹理识别上,并取得了很好的结果。Gabor函数可以捕捉到相当多的纹理信息。用MATLAB实现Gabor小波对图片的纹理特征提取的过程如下:

(1) 在matlab中,编写gaborfilter()函数,实现对图片的Gabor小波变换;

(2) 对Gabor小波变换处理过的图片做二维卷积变换;

(3) 对经过上述两种变换后的图片进行均值和方差的提取,作为特征。

如上述描述,首先编写gaborfilter()函数,如下:

function [G, gabout] = gaborfilter(I, Sx, Sy, f, theta)
% GABORFILTER Gabor小波变换
% 
% 输入: 
%     I -- 输入的灰度图像
%     Sx, Sy -- 变量在x,y轴变化的范围,即选定的gabor小波窗口的大小
%     f -- 正弦函数的频率
%     theta -- gabor滤波器的方向
% 
% 输出:
%     G -- gabor滤波函数g(x,y)
%     gabout -- gabor滤波后的图像

% created by gq 

if isa(I, 'double') ~= 1 % 判断输入的图像I数据类型是否是double
    I = double(I);  % 如果不是double类型,则转换为double类型
end

for x = -fix(Sx) : fix(Sx)   % fix表示向零方向取整
   for y = -fix(Sy) : fix(Sy)
      xp = x * cos(theta) + y * sin(theta); 
      yp = y * cos(theta) - x * sin(theta); 
      G(fix(Sx)+x+1, fix(Sy)+y+1) = exp(-0.5 * ((xp/Sx)^2 + (yp/Sy)^2)) * cos(2*pi*f*xp); 
   end
end

Imgabout = conv2(I, double(imag(G)), 'same'); % 对图像数据虚部做二维卷积
Regabout = conv2(I, double(real(G)), 'same'); % 对图像数据实部做二维卷积

gabout = sqrt(Imgabout .* Imgabout + Regabout .* Regabout); % gabor小波变换后的图像gabout

然后调用:

% ---------- 采用Gabor分析法分析纹理图像 ---------- % 
close all; clear all; clc; 

I = imread('wall.jpg'); 

if ndims(I) == 3
   I = rgb2gray(I); 
else
   I = I; 
end

figure; 
subplot(121), imshow(I); 

[G, gabout] = gaborfilter(I, 2, 4, 16, pi/3); % 调用gaborfilter()函数对图像做小波变换
subplot(122), imshow(uint8(gabout)); 

J = fft2(gabout); % 对小波变换后的图像做FFT变换,变换到频域
 
A = double(J); 
[m, n] = size(A); 
B = A; 
C = zeros(m, n); 
for i = 1 : m-1
   for j = 1 : n-1
      B(i,j) = A(i+1, j+1); 
      C(i,j) = abs(round(A(i,j) - B(i,j))); % 灰度差分
   end
end

h = imhist(mat2gray(C)) / (m*n); 

% ---------- 求图像的均值、对比度、熵 ---------- % 
mean = 0; 
con = 0; 
ent = 0; 
for i = 1 : 256
   mean = mean + (i * h(i)) / 256; 
   con = con + i * i * h(i); 
   if h(i) > 0
      ent = ent - h(i) * log2(h(i)) ; 
   end
end

disp('均值是:'); 
disp(mean); 
disp('对比度是:'); 
disp(con); 
disp('熵是:'); 
disp(ent); 


猜你喜欢

转载自blog.csdn.net/qq_15971883/article/details/80339058