2016-09-20 389 views
1

我正在嘗試編寫訪問圖像中每個塊的函數replace,保留前2000個元素,並將剩餘的元素設置爲零。但每次我這樣做的時候,我發現這個錯誤消息:我的matlab代碼中的blockproc函數有什麼問題?

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函數的代碼:

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

我的腳本使用replacedct2blockproc

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_struct'替換'block'並報告會發生什麼? –

回答

0

你應該改變一些東西,直到你得到一個正在運行的代碼。首先,你應該對replace函數做一些修改,因爲在你的函數中沒有定義輸出。此外,輸入參數應更改爲data,因爲你是路過block.data給它,這是一個矩陣:

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

這就是說,這個函數什麼也不做你的榜樣,因爲你正在8×8塊。

如果我理解正確,在將replace應用於該塊之後,您希望對每個塊應用2維離散餘弦變換。如果你看看blockproc,你會看到第三個輸入參數應該是一個函數句柄。在你的情況下,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