2016-09-20 4 views
1

イメージ内のすべてのブロックにアクセスする関数replaceを作成しようとしています。最初の2000要素を保持し、残りの要素をゼロに設定します。しかし、私はやるたびに、私はこのエラーメッセージを見つけること:私のMATLABコードのblockproc関数に何が問題になっていますか?

function features = replace(block) 
for(i = 2000:length(block.data)) 
    % set each element to 0 
    block.data(i) = 0 
end 

そしてreplaceを使用して私のスクリプト、dct2blockproc

Error using blockproc>parse_inputs (line 997) 
Invalid block function. BLOCKPROC expects the user function, FUN, to be a valid function handle. 

Error in blockproc (line 219) 
[source,fun,options] = parse_inputs(source,block_size,fun,varargin{:}); 

Error in blk2 (line 6) 
J3 = blockproc(I3,[8 8],'dct2',f); 

をここreplace関数のコードです

I3 = imread('process/13.jpg'); 
figure; 
imshow(I3); 
f = @(block)replace(block.data); 
J3 = blockproc(I3,[8 8],'dct2',f); 
figure 
imshow(J3); 
imshow(log(abs(J3)),[]), colormap(jet), colorbar 
J3(abs(J3) < 5) = 0; 
%B=J; 
%B(1:1) = 0; 
[M N]=size(J3); 
fun3=zigzag(J3); 
in4=izigzag(fun3,M,N); 
f = @(block)replace(block.data); 
J22 = blockproc(in4,[8 8],'idct2',f); 
figure 
imshow(J22,[0 255]); 
figure 
imshow(log(abs(J22)),[]), colormap(jet), colorbar 

the input image

+0

'block'を' block_struct'に置き換えて何が起こるか報告できますか? –

答えて

0

実行中のコードが得られるまで、いくつか変更する必要があります。まず、出力が定義されていないので、replace関数にいくつかの変更を加える必要があります。あなたは8×8ブロックを作っていることから、言っ

function data = replace(data) 
data(2000:end) = 0; 

は、この機能はあなたの例では何もしません:あなたは行列である、それにblock.dataを渡しているので、さらに、入力引数は、dataに変更する必要があります。

私が正しく理解している場合は、ブロックにreplaceを適用した後に、各ブロックに2次元のコサイン変換を適用します。 blockprocを見ると、3番目の入力引数が関数ハンドルであるはずです。あなたのケースでは、fは関数ハンドルの例ですが、正確には必要ではありません。あなたはdct2とそれを組み合わせるし、その後blockprocに関数ハンドルを渡すことができます。

f = @(block) dct2(replace(block.data)); 
J3 = blockproc(double(I3),[8 8], f); 

注:あなたはdoubleに画像をキャストする必要はありませんが、そうでない場合には、情報の高い損失を持つことになります。

+0

あなたの偉大な答えをありがとう、それは働いた –

+0

あなたは歓迎です。あなたが答えに満足すれば、あなたは[回答を受け入れる]ことができます(http://stackoverflow.com/help/someone-answers)。だから、似たような質問をしている他の人々は、回答。 – erfan

関連する問題