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 comentarios

Matt J
Matt J el 30 de Sept. de 2012
Help us help you by showing your code.
JK_1989
JK_1989 el 30 de Sept. de 2012
Editada: Ashish Uthama el 1 de Oct. de 2012
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
JK_1989
JK_1989 el 30 de Sept. de 2012
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
JK_1989
JK_1989 el 30 de Sept. de 2012
sir,
generally , can i use my own defined fn with blockproc.....?
can that fn hav more than one input or output arguments
Image Analyst
Image Analyst el 30 de Sept. de 2012
Yes, you can. That's exactly what I show you how to do in my demo below.
JK_1989
JK_1989 el 30 de Sept. de 2012
well sir, thanks a lot . i wil refer to that n wil get back to u , sir..

Iniciar sesión para comentar.

 Respuesta aceptada

Image Analyst
Image Analyst el 30 de Sept. de 2012
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;

Más respuestas (0)

Preguntada:

el 30 de Sept. de 2012

Community Treasure Hunt

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

Start Hunting!

Translated by