灰度图像之同现矩阵的求解算法与实现
- 算法
- 实现
1. 实验平台与数据
本算法使用Matlab语言实现,实验平台为Windows 8 32位操作系统、4GB内存(可用为2.31GB)、Matlab2013b。
数据1:课堂例子
数据2:如下,其中,d=(1,0)
数据3:如下图2所示:
1) coom.m文件源码
function [ P ] = coom( I,d)
% ----------------------计算矩阵或图像的同现矩阵-----------------------------
% Input:
% I:灰度图像文件名或矩阵(整数值(0~255))
% d:位移矢量
% Output:
% 同现矩阵 P:(L,L)
% Usage:
% SSELMHSIC('ImageFileName',d)
% 求灰度图像的同现矩阵
% Or:
% SSELMHSIC(I,d)
% 求矩阵I的同现矩阵
%-------------------------------------------------------------------------
% Sample:
%%%% Authors: Zhi Liu
%%%% XiDian University Student
%%%% EMAIL: zhiliu.mind@gmail.com
%%%% DATE: 8-11-2013
%% 对数据进行预处理
if ~exist('I','var') || isempty(I)
error('输入图像 I 未定义或为空!');
end
if ~exist('d','var') || isempty(d) ||numel(d) ~= 2
error('位移矢量 d 未定义或为空或 d中的元素超过2!');
end
if isstr(I)
I = imread(I);
end
if d(1)<0 ||d(2)<0
error('位移矢量 d 的元素应该大于0!');
end
[M,N,~] = size(I);
%% 统计灰度级的最大值
% L = length(unique(I));
L = max(max(I))+1;
%% 计算同现矩阵
P = zeros(L,L); % 预分配内存,提高速度
for i = 1:M-d(2) % 对图像进行逐元素扫描
for j = 1:N-d(1)
ii =I(i,j)+1;
jj =I(i+d(2),j+d(1))+1;
P(ii,jj) =P(ii,jj) + 1;
end
end
%% 以图像的形式显示同现矩阵P
figure
subplot(121)
imshow(I,[]);
title('原灰度级图像');
subplot(122)
imshow(P,[]);
title('左图对应的同现矩阵');
end
2) ImaM.m文件源码(存储数据1和数据2灰度图像矩阵)
function [ IM ] = ImaM( opt)
%UNTITLED Summary of this function goes here
% Detailedexplanation goes here
if opt == 1
IM =[2 1 2 0 1
0 2 1 1 2
0 1 2 2 0
1 2 2 0 1
2 0 1 0 1];
elseif opt == 2
IM =[2 1 2 2
1 4 4 1
4 1 2 2
1 2 4 4
2 1 1 2];
end
end
3. 实验结果
1) 数据1
在命令窗口输入P=coom(ImaM(1),[1,1])回车后结果如下图4(a)所示:
由上图(a)和图1(b)可知程序运行正确无误。
图5 数据1运行结果图形化显示
2) 数据2
在命令窗口输入P=coom(ImaM(2),[1,0])回车后结果如上图4(b)所示,对比改图与图2(b),可知程序正确无误。
图6 数据2运行结果图形化显示
3) 数据3
在命令窗口输入P=coom('lena.png',[1,1]);回车后即可得到同现矩阵 ,由于该图像数据较大,故仅以图像方式显示如下图:
图7 数据3运行结果图形化显示