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空间进行适当量化后再计算其直方图,以减少计算量。
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);