zigzag模式提取矩阵元素

zigzag模式提取矩阵元素

zouxy09@qq.com

http://blog.csdn.net/zouxy09

 

       这节博文只是为了上传个代码而已。希望对需要的人有用。zig-zag模式如下图所示。它可以用来按照以下的顺序来提取一个矩阵的元素。

       这个东西用在哪呢?用在离散余弦变换的系数提取里面。离散余弦变换(DCT)是种图像压缩算法,JPEG-2000好像就是用它来进行图像压缩的。DCT将图像从像素域变换到频率域。然后一般图像都存在很多冗余和相关性的,所以转换到频率域之后,只有很少的一部分频率分量的系数才不为0,大部分系数都为0(或者说接近于0),这样就可以进行高效的编码,以达到压缩的目的。下图的右图是对lena图进行离散余弦变换(DCT)得到的系数矩阵图。从左上角依次到右下角,频率越来越高,由图可以看到,左上角的值比较大,到右下角的值就很小很小了。换句话说,图像的能量几乎都集中在左上角这个地方的低频系数上面了。

       而且,系数的重要性一定程度上是按照zigzag模式进行排列的。所以就可以通过zigzag模式来提取这个矩阵前面的重要性的元素,作为这个图像在频率域上的特征,然后可以拿去做分类啥的,以达到降维的功效。

      具体代码如下:

zigzagCoder.m

function dctVector = zigzagCoder(A, needNumCoefficient)
%// Select elements of a square matrix using zig-zag pattern
%// Author : zouxy  
%// Date   : 2013-10-28  
%// HomePage : http://blog.csdn.net/zouxy09  
%// Email  : zouxy09@qq.com

%% input: A : square matrix 
%%        needNumCoefficient : how many coefficient you want to maintain
%% output: dctVector: vector contain coefficients by col

	if size(A, 1) ~= size(A, 2)
		display('Warning: your matrix should be square!');
		if size(A, 1) > size(A, 2)
			A = A(1:size(A, 2), 1:size(A, 2));
		else
			A = A(1:size(A, 1), 1:size(A, 1));
		end
	end
	
	if needNumCoefficient > (size(A, 1) * size(A, 2))
		needNumCoefficient = size(A, 1) * size(A, 2);
	end
	
	A = A';
	count = 1;    
	for dim_sum = 2 : (size(A, 1) + size(A, 2))
		if mod(dim_sum, 2) == 0
			for i = 1 : size(A, 1)
				if dim_sum - i <= size(A, 1) & dim_sum - i > 0
					dctVector(count) = A(i, dim_sum - i);
					count = count + 1;
				end
			end
		else
			for i = 1 : size(A, 1)
				if dim_sum - i <= size(A, 1) & dim_sum - i >0
					dctVector(count) = A(dim_sum - i, i);
					count = count + 1;
				end                   
			end   
		end
	end
	dctVector = dctVector(1:needNumCoefficient);
	dctVector = dctVector';
	
end

例如:

testZigzagCode.m

mat = [1 2 6; 3 5 7; 4 8 9];
num = size(mat, 1) * size(mat, 2);
code = zigzagCoder(mat, num);
disp(mat);
disp(code');

输入方阵:

1    2     6

3    5     7

4    8     9

输出向量:

1    2     3     4    5     6     7    8     9

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值