我的matlab代码中的blockproc函数有什么问题?
我试图编写函数我的matlab代码中的blockproc函数有什么问题?,matlab,image-processing,Matlab,Image Processing,我试图编写函数replace,该函数访问图像中的每个块,保留前2000个元素,并将其余元素设置为零。但每次这样做时,我都会发现以下错误消息: 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) [s
replace
,该函数访问图像中的每个块,保留前2000个元素,并将其余元素设置为零。但每次这样做时,我都会发现以下错误消息:
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
以及使用replace
、dct2
和blockproc
的脚本:
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
f = @(block) dct2(replace(block.data));
J3 = blockproc(double(I3),[8 8], f);
I3=imread('process/13.jpg');
图形
imshow(I3);
f=@(块)替换(块数据);
J3=blockproc(I3,[8],'dct2',f);
图形
imshow(J3);
imshow(log(abs(J3)),[])、colormap(jet)、colorbar
J3(abs(J3)<5)=0;
%B=J;
%B(1:1)=0;
[mn]=尺寸(J3);
fun3=之字形(J3);
in4=izigzag(fun3,M,N);
f=@(块)替换(块数据);
J22=blockproc(in4,[8],'idct2',f);
图形
imshow(J22[0255]);
图形
imshow(log(abs(J22)),[])、colormap(jet)、colorbar
在获得运行的代码之前,您应该做一些更改。首先,您应该在
replace
函数中进行一些更改,因为在您的函数中没有定义输出。此外,输入参数应更改为data
,因为您正在向其传递block.data
,它是一个矩阵:
function data = replace(data)
data(2000:end) = 0;
也就是说,该函数在您的示例中不起任何作用,因为您正在生成8x8块
如果我理解正确,在对每个块应用replace
后,您希望对每个块应用二维离散余弦变换。如果你看一下,你会发现第三个输入参数应该是一个函数句柄。在您的例子中,f
是函数句柄的一个示例,但并不完全是您想要的。您可以将其与dct2
组合,然后将函数句柄传递给blockproc
:
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
f = @(block) dct2(replace(block.data));
J3 = blockproc(double(I3),[8 8], f);
注意:您不必将图像强制转换为双倍,但如果不这样做,您将有更高的信息丢失。在获得运行的代码之前,您应该更改一些内容。首先,您应该在
replace
函数中进行一些更改,因为在您的函数中没有定义输出。此外,输入参数应更改为data
,因为您正在向其传递block.data
,它是一个矩阵:
function data = replace(data)
data(2000:end) = 0;
也就是说,该函数在您的示例中不起任何作用,因为您正在生成8x8块
如果我理解正确,在对每个块应用replace
后,您希望对每个块应用二维离散余弦变换。如果你看一下,你会发现第三个输入参数应该是一个函数句柄。在您的例子中,f
是函数句柄的一个示例,但并不完全是您想要的。您可以将其与dct2
组合,然后将函数句柄传递给blockproc
:
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
f = @(block) dct2(replace(block.data));
J3 = blockproc(double(I3),[8 8], f);
注意:您不必将图像强制转换为
double
,但如果不这样做,您将有更高的信息损失。您可以用block\u struct
替换block
并报告发生的情况吗?您可以用block\u struct
替换block
并报告发生的情况吗?欢迎。如果你对答案感到满意,你可以这样做,这样其他有类似问题的人就会知道答案中可能有一些有用的信息。欢迎你。如果你对答案感到满意,那么其他有类似问题的人就会知道答案中可能有一些有用的信息。