对图像应用“保留前N个值”蒙版,以块为单位

时间:2018-10-07 12:53:52

标签: image matlab mask dct submatrix

我很难理解如何在矩阵的数据/子矩阵块上应用函数。

我的任务是拍摄一张图像,将其分成8x8块,然后从每个块中选取8个最大值,并将其余值设置为零。我知道方法可以通过for循环,但是我想学习如何在数据块上应用函数。

当前,我正在将一个函数应用于整个256x256矩阵,但是我需要找到一种方法将其仅应用于每个8x8块。这是我的评论代码:

predict()

1 个答案:

答案 0 :(得分:1)

您的代码可以受益于向量化(即,删除for循环)。

function C = q52688681
%% DCT transformation
I = imread('cameraman.tif');
I = im2double(I);
T = dctmtx(8); %returns the 8-by-8 DCT transform matrix
B = blockproc(I,[8 8], @(block_struct) T * block_struct.data * T.');
C = blockproc(I,[8 8], @applyMask);

function out = applyMask(img)
NMAX = 8;
out = zeros(size(img.data));
[~,idx] = maxk(img.data(:), NMAX);
out(idx) = img.data(idx);

如果您的MATLAB版本是>= R2017b,则可以使用maxk,否则:

function out = applyMask(img)
NMAX = 8;
out = zeros(size(img.data));
[~,idx] = sort(img.data(:), 'descend');
out( idx(1:NMAX) ) = img.data( idx(1:NMAX) );

通过执行以下操作,您可以进一步减少代码和计算量:

function B = q52688681
NMAX = 8;
I = im2double(imread('cameraman.tif'));
B = blockproc(I, [NMAX NMAX], @(x)applyMask(x, NMAX, dctmtx(NMAX)) );

function out = applyMask(blk, nmax, T)
img = T * blk.data * T.';
out = zeros(size(img));
[~,idx] = sort(img(:), 'descend');
out( idx(1:nmax) ) = img( idx(1:nmax) );

在注释中让我知道该代码是否有任何不清楚的地方,我将尽力对其进行解释。