blockproc in matlab image processing

hi fellas, iam pursuing my proj in my masters. got a bug here .iam just planning to use my own function (with 2 input and 1 output arguments ) with blockproc fn but then it shows the following error " Cannot combine values of class double with struct" . it is showing error fr the following line "sq1=gsubtract(ca2,ecA);" in my function. pleas help me ..
thanks in advance

6 个评论

Help us help you by showing your code.
sure :-) my function which i wanna interface with blockproc is
fun ction [clm,rv2,df] = estmat_2b(ecA,cv1,rv2)
[~,nh]=size(ecA);
for i=1:nh
q=1;
for stp1=1:300;
if(q~=1)
cv1(i,1)=cv1(i,1) + 0.01;
end
vq1(i,1)=cv1(i,1);
[ca2]=estmat(cv1,rv2,nh,i);
sq1=gsubtract(ca2,ecA);
e(i,q)=sum(sum(sq1.*sq1));
e3(i,q)=e(i,q);
vv12(i,q)=cv1(i,1);
cv12(i,1)=vq1(i,1);
if(stp1==300)
df=min(e(i,:));
[row col]=find(e(i,:)==df);
colm=min(col);
cv1(i,1)=vv12(i,colm);
end
q=q+1;
end
end
clm=cv1;
e11=e;
end
my main function is
function [outp1,outp2] = blk_itrn(inp1,ecA)
i = 5; v1=zeros(i,1); v2=zeros(i,1); for fn=1:5;
v22=ones(i,1); v11=ones(i,1);
for i=1:1;
func1 = @(block) estmat_2b(block,v1,v22); outp1 = blockproc(inp1,[i,i],func1);
func2 = @(block) estmat_3b(block,v11,v2); outp2 = blockproc(inp1,[i,i],func2);
end
end
sir,
generally , can i use my own defined fn with blockproc.....?
can that fn hav more than one input or output arguments
Yes, you can. That's exactly what I show you how to do in my demo below.
well sir, thanks a lot . i wil refer to that n wil get back to u , sir..

请先登录,再进行评论。

 采纳的回答

Here's demo of two different ways of using it.
% Demo of blockproc in two different ways.
% One uses an anonymous function to return a block of pixels
% the same size as the sliding window block.
% The other uses a custom written function to return a
% single value for each slinding window position.
function blockproc_demo()
try
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
workspace; % Make sure the workspace panel is showing.
fontSize = 20;
% Change the current folder to the folder of this m-file.
if(~isdeployed)
cd(fileparts(which(mfilename)));
end
% Read in standard MATLAB demo image.
grayImage = imread('cameraman.tif');
[rows columns numberOfColorChannels] = size(grayImage);
% Display the original image.
subplot(2, 2, 1);
imshow(grayImage, []);
caption = sprintf('Original Image\n%d by %d pixels', ...
rows, columns);
title(caption, 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'Position', get(0,'Screensize'));
set(gcf, 'name','Image Analysis Demo', 'numbertitle','off')
% Block process the image.
windowSize = 3;
% Each 3x3 block will get replaced by one value.
% Output image will be smaller by a factor of windowSize.
myFilterHandle = @myFilter;
blockyImage = blockproc(grayImage,[windowSize windowSize], myFilterHandle);
[rowsP columnsP numberOfColorChannelsP] = size(blockyImage);
% Display the processed image.
% It is smaller, but the display routine imshow() replicates
% the image so that it looks bigger than it really is.
subplot(2, 2, 2);
imshow(blockyImage, []);
caption = sprintf('Image Processed in %d by %d Blocks\n%d by %d pixels\nCustom Box Filter', ...
windowSize, windowSize, rowsP, columnsP);
title(caption, 'FontSize', fontSize);
% Now let's do it an alternate way where we use an anonymous function.
% We'll take the standard deviation in the blocks.
windowSize = 8;
myFilterHandle2 = @(block_struct) ...
std2(block_struct.data) * ones(size(block_struct.data));
blockyImageSD = blockproc(grayImage, [windowSize windowSize], myFilterHandle2);
[rowsSD columnsSD numberOfColorChannelsSD] = size(blockyImageSD);
subplot(2, 2, 4);
imshow(blockyImageSD, []);
caption = sprintf('Image Processed in %d by %d Blocks\n%d by %d pixels\nAnonymous Standard Deviation Filter', ...
windowSize, windowSize, rowsSD, columnsSD);
title(caption, 'FontSize', fontSize);
% Note: the image size of blockyImageSD is 256x256, NOT smaller.
% That's because we're returning an 8x8 array instead of a scalar.
uiwait(msgbox('Done with demo'));
catch ME
errorMessage = sprintf('Error in blockproc_demo():\n\nError Message:\n%s', ME.message);
uiwait(warndlg(errorMessage));
end
return;
% Takes one 3x3 block of image data and multiplies it
% element by element by the kernel and
% returns a single value.
function singleValue = myFilter(blockStruct)
try
% Assign default value.
% Will be used near sides of image (due to boundary effects),
% or in the case of errors, etc.
singleValue = 0;
% Create a 2D filter.
kernel = [0 0.2 0; 0.2 0.2 0.2; 0 0.2 0];
% kernel = ones(blockStruct.blockSize); % Box filter.
% Make sure filter size matches image block size.
if any(blockStruct.blockSize ~= size(kernel))
% If any of the dimensions don't match.
% You'll get here near the edges,
% if the image is not a multiple of the block size.
% warndlg('block size does not match kernel size');
return;
end
% Size matches if we get here, so we're okay.
% Extract our block out of the structure.
array3x3 = blockStruct.data;
% Do the filtering. Multiply by kernel and sum.
singleValue = sum(sum(double(array3x3) .* kernel));
catch ME
% Some kind of problem...
errorMessage = sprintf('Error in myFilter():\n\nError Message:\n%s', ME.message);
% uiwait(warndlg(errorMessage));
fprintf(1, '%s\n', errorMessage);
end
return;

更多回答(0 个)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by