我很难理解如何在矩阵的数据/子矩阵块上应用函数。
我的任务是拍摄一张图像,将其分成8x8块,然后从每个块中选取8个最大值,并将其余值设置为零。我知道方法可以通过for循环,但是我想学习如何在数据块上应用函数。
当前,我正在将一个函数应用于整个256x256矩阵,但是我需要找到一种方法将其仅应用于每个8x8块。这是我的评论代码:
predict()
答案 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) );
在注释中让我知道该代码是否有任何不清楚的地方,我将尽力对其进行解释。