Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的matlab代码中的blockproc函数有什么问题?_Matlab_Image Processing - Fatal编程技术网

我的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
并报告发生的情况吗?欢迎。如果你对答案感到满意,你可以这样做,这样其他有类似问题的人就会知道答案中可能有一些有用的信息。欢迎你。如果你对答案感到满意,那么其他有类似问题的人就会知道答案中可能有一些有用的信息。