使用均方误差matlab提取块

时间:2015-04-30 10:49:03

标签: matlab

Mean Square Error(MSE)是一种用于定义两个块之间差异的方法,可以按如下方式计算:ab两个块大小相等

MSE = sqrt(sum(sum((a-b).^2)))/size(a or b)

如果MSE小于给定的阈值,则两个块没有差别。

给定矩阵A,已经重新整形为包含所有相同原始的块, 目的是提取MSE小于给定阈值的所有块(基于第一个块),然后返回这些块的平均值。再次,提取MSE小于给定阈值的第二组块,其中必须不再提取已经分配为其他块组的一部分的块。更好的是,必须删除它以减少搜索时间。依此类推,直到矩阵A的所有块都被指定为组的一部分。这是一个例子:

给定矩阵AA的大小为2乘14:

A= [1 1  2 2  9 9  4 4  6 6  5 5  3 3 
    1 1  2 2  9 9  4 4  6 6  5 5  3 3];

PS:没有必要这些块包含相同的数字,只是为了使示例清晰。

块大小为:2乘2

阈值为2

现在我们从矩阵MSE中的第一个块开始提取A小于阈值的所有块。这些块是:

1 1  2 2  3 3
1 1  2 2  3 3

这些街区的平均值是

  Result= [ 2 2
            2 2];

一次。我们提取MSE小于阈值的所有块,但是我们需要避免已经提取的块,所以第二组块是:

9 9
9 9

这个区块的意思是它自己,所以:

Result= [2 2  9 9
         2 2  9 9];

一次。我们提取MSE小于阈值的所有块,但是我们需要避免已经提取的块,所以第三组块是:

    4 4  6 6  5 5  
    4 4  6 6  5 5

3 3 
3 3
即使MSE小于阈值,

也不属于该群组,因为已经将其提取为第一组的一部分。

这些街区的意思是:

5 5
5 5

因此结果应为:

Result= [2 2  9 9 5 5
         2 2  9 9 5 5];

有什么快速的方法可以应用吗?

1 个答案:

答案 0 :(得分:1)

这是我的解决方案:

A = [1 1  2 2  9 9  4 4  6 6  5 5  3 3 
     1 1  2 2  9 9  4 4  6 6  5 5  3 3];

blockLen = 2;
MSEthresh = 1;
nBlocks = size(A,2) / blockLen;
meanBlocks = [];
bSelectRefBlock = true;

while(~isempty(A))
    if(bSelectRefBlock)
        %// Select new reference block
        refBlock = A(:, 1:blockLen);
        bSelectRefBlock = false;
        A = A(:, blockLen+1:end);
        iBlock = 1;
        selectedBlocks = refBlock;
    else
        if(iBlock > size(A,2))
            %// End of A reached. Compute mean of selected blocks
            blockCols = reshape(selectedBlocks, [numel(refBlock) numel(selectedBlocks)/numel(refBlock)]);
            meanBlockCols = mean(blockCols, 2);
            meanBlocks(:, end+1:end+blockLen) = reshape(meanBlockCols, [size(refBlock, 1) blockLen]);
            bSelectRefBlock = true;
        else
            %// Test next block with MSE and select if below threshold
            MSE = sqrt(sum(sum((A(:, iBlock:(iBlock+blockLen-1)) - refBlock).^2))) / numel(refBlock);
            if(MSE <= MSEthresh)
                selectedBlocks(:, end+1:end+blockLen) = A(:, iBlock:(iBlock+blockLen-1));
                A(:, iBlock:(iBlock+blockLen-1)) = [];
            else
                iBlock = iBlock + blockLen;
            end
        end
    end
end
%// Compute mean of selected blocks for last group
blockCols = reshape(selectedBlocks, [numel(refBlock) numel(selectedBlocks)/numel(refBlock)]);
meanBlockCols = mean(blockCols, 2);
meanBlocks(:, end+1:end+blockLen) = reshape(meanBlockCols, [size(refBlock, 1) blockLen]);
相关问题