ورود

View Full Version : تصحیح خطاIndex exceeds matrix dimensions



sama.fa
چهارشنبه 06 خرداد 1394, 18:20 عصر
باسلام من میخوام تصویر به اندازه16*16بلوک بندی کنم ولی کدی که نوشتم خطامیده فقط به تصاویر خاص مثل تصویر لنا اجرا میشه برای تصویر دلخواه اجرا نمیشه کد و خطا را در اینجا قرار میدهم لطفا راهنمایی کنید ممنون میشم زودجواب بدهید.

کد:



clc
clear
close all
img = imread('1.png');

figure;
subplot(221)
imshow(img)
g = mean2(img);

k=16;
[h,w]=size(img);

n = 1;
for i=1:k:h
for j=1:k:w
imblock=img(i:i+k-1,j:j+k-1);
if nnz(imblock>g)>0
S(n) = sum(imblock(imblock>g));
else
S(n) = k * g;
end
n = n+1;
end
end
subplot(2,2,2)
imshow(reshape(S,h/16,w/16)',[],'InitialMagnification','fit')

خطا:

Index exceeds matrix dimensions

sama.fa
چهارشنبه 06 خرداد 1394, 18:57 عصر
در ضمن من این کد برای یه پایگاه داده تصویر می خوام نه یه دونه تصویر.حالا چطور میتونم بلوک بندیش کنم؟؟؟؟

rahnema1
چهارشنبه 06 خرداد 1394, 21:21 عصر
سلام
به این صورت تصویر به دست میاد
در نسخه های جدیدتر متلب به جای blkproc از تابع blockproc می شه استفاده کرد

clc
clear
close all
img = imread('1.png');

figure;
subplot(221)
imshow(img)
g = mean2(img);
img_gt_g = img > g;
k=16;
S = blkproc (img_gt_g,[k k], @(x) sum(x(:)));
S(S==0) = k *g;

subplot(2,2,2)
imshow(S,[],'InitialMagnification','fit')

hhamidy
چهارشنبه 06 خرداد 1394, 22:45 عصر
سلام
به این صورت تصویر به دست میاد
در نسخه های جدیدتر متلب به جای blkproc از تابع blockproc می شه استفاده کرد

clc
clear
close all
img = imread('1.png');

figure;
subplot(221)
imshow(img)
g = mean2(img);
img_gt_g = img > g;
k=16;
S = blkproc (img_gt_g,[k k], @(x) sum(x(:)));
S(S==0) = k *g;

subplot(2,2,2)
imshow(S,[],'InitialMagnification','fit')


Subscripted assignment dimension mismatch.


Error in blkproc (line 92)
aa(border(1)+(1:ma),border(2)+(1:na)) = a;

sama.fa
پنج شنبه 07 خرداد 1394, 15:52 عصر
باسلام ممنون از پاسختون ولی بازم ارور میده

Subscripted assignment dimension mismatch.


Error in blkproc (line 92)
aa(border(1)+(1:ma),border(2)+(1:na)) = a

وبرای بلوک های بعدی که من تو کد قبلی قراردادم بقیه کد قرارداده نشده

rahnema1
پنج شنبه 07 خرداد 1394, 21:13 عصر
من که با چند تا عکس مختلف با سایزهای مختلف امتحان کردم ( البته در نرم افزار octave ) مشکلی وجود نداشت اگه بتونید عکس را بفرستید تا امتحان کنم
این برنامه برای تمام بلاکها انجام میده در واقع با حذف حلقه ها کار سریعتر شده

sama.fa
جمعه 08 خرداد 1394, 16:42 عصر
مثلا این تصویر ولی کلا رو چندتاتصاویرپایگاه داده میخوام کد اجرا شه


131775

rahnema1
جمعه 08 خرداد 1394, 22:05 عصر
در نرم افزار ocatve تست کردم بدون هیچ مشکلی اجرا شد و S هم به این شکل شد

6.0000 155.0000 246.0000 233.0000 72.0000 2003.4363
110.0000 256.0000 256.0000 256.0000 216.0000 2003.4363
128.0000 225.0000 247.0000 227.0000 162.0000 2003.4363
147.0000 140.0000 133.0000 112.0000 55.0000 2.0000
127.0000 191.0000 178.0000 175.0000 106.0000 3.0000
74.0000 139.0000 42.0000 78.0000 11.0000 2003.4363
50.0000 75.0000 92.0000 17.0000 35.0000 2003.4363

sama.fa
شنبه 09 خرداد 1394, 13:02 عصر
ممنون ولی من تو نرم افزار متلب میخوام که متاسفانه خطا میده.

ضمنا این کدی که نوشتم ببنین درسته برای بلوک بندی؟؟؟

img = imread('D:\image\roz.png',3);
img = imresize(img,[92,112]);
k=16;
L1 = size(img,1);
L2 = size(img,2);

L1 = k*fix(L1/k);
L2 = k*fix(L2/k);

L1_S = L1/k;
L2_S = L2/k;

img = imresize(img,[L1,L2]);
S = zeros(L1_S,L2_S);
figure(1);
subplot(121)
imshow(img)
g = mean2(img);
[h,w]=size(img);
n = 1;

i1 = 0;j1 = 0;


for i=1:L1_S
for j=1:L2_S
nn_i = (1:k)+(i-1)*k;
nn_j = (1:k)+(j-1)*k;
imblock=img(nn_i,nn_j);
if nnz(imblock>g)>0
S(i,j) = sum(imblock(imblock>g));
else
S(i,j) = k * g;
end
end
end
subplot(122)
imshow(S,[],'InitialMagnification','fit')

rahnema1
شنبه 09 خرداد 1394, 13:41 عصر
این کد blkproc در اکتاو هست شما این را در فایلی به نام بذارید و نام blkproc را در برنامه بالا به octblkproc تغییر بدید ببینیم اجرا می شه یا نه.

function B = octblkproc(A, varargin)
if(nargin<3)
error('blkproc: invalid number of parameters.');
end

%% check 'indexed' presence
indexed=false;
p=1;
if(ischar(varargin{1}) && strcmp(varargin{1}, 'indexed'))
indexed=true;
p = p + 1;
if(isa(A,'uint8') || isa(A,'uint16'))
padval=0;
else
padval=1;
end
else
padval=0;
end

%% check [m,n]
if(~isvector(varargin{p}))
error('blkproc: expected [m,n] but param is not a vector.');
end
if(length(varargin{p})~=2)
error('blkproc: expected [m,n] but param has wrong length.');
end
sblk=varargin{p}(:);
p= p + 1;

%% check [mborder,nborder]
if(nargin<p)
error('blkproc: required parameters haven't been supplied.');
end

if(isvector(varargin{p}) && isnumeric(varargin{p}))
if(length(varargin{p})~=2)
error('blkproc: expected [mborder,nborder] but param has wrong length.');
end
sborder=varargin{p}(:);
p = p + 1;
else
sborder=[0;0];
end

%% check fun
%% TODO: add proper checks for this one
if(nargin<p)
error('blkproc: required parameters haven't been supplied.');
end

fun=varargin{p};
if(~isa(fun,'function_handle') &&
~isa(fun,'inline function') &&
~ischar(fun))
error('blkproc: invalid fun parameter.');
end

%% remaining params are params to fun
%% extra params are p+1:nargin-1

%% First of all we calc needed padding which will be applied on bottom
%% and right borders
%% The '-' makes the function output needed elements to fill another
%% block directly
sp=mod(-size(A)',sblk);

if(any(sp))
A=padarray(A,sp,padval,'post');
end

%% we store A size without border padding to iterate later
soa=size(A);

%% If we have borders then we need more padding
if(any(sborder))
A=padarray(A,sborder,padval);
end

%% calculate end of block
eblk=sblk+sborder*2-1;

%% now we can process by blocks
%% we try to preserve fun return type by concatenating everything
for i=1:sblk(1):soa(1)
%% This assures r has the same class as returned by fun
r=feval(fun,A(i:i+eblk(1),1:1+eblk(2)),varargin{p+ 1:nargin-1});
for j=1+sblk(2):sblk(2):soa(2)
r=horzcat(r,feval(fun,A(i:i+eblk(1),j:j+eblk(2)),v arargin{p+1:nargin-1}));
end
if(i==1) %% this assures B has the same class as A
B=r;
else
B=vertcat(B,r);
end
end
end

sama.fa
شنبه 09 خرداد 1394, 15:19 عصر
من با نرم افزار ocatve کارر نکردم نمیدونم اصلا چیه؟میشه بیشتر راهنمایی کنید؟؟؟ممنون میشم

ضمنا من میخوام بلوک 16*16 هم پوشان باشه

rahnema1
شنبه 09 خرداد 1394, 15:53 عصر
نگفتم از ocatve استفاده کنید گفتم به جای blkproc از این تابعی که در بالا گذاشتم استفاده کنید که اسمش octblkproc هست . همپوشان هم میشه به راحتی انجام داد شما فعلا این تابع را اجرا کنید

sama.fa
شنبه 09 خرداد 1394, 16:20 عصر
این کد برای بلوک بندی 16*16هم پوشان صحیح نیست؟؟؟


img = imread('D:\image\roz.png',3);
img = imresize(img,[92,112]);
k=16;
L1 = size(img,1);
L2 = size(img,2);

L1 = k*fix(L1/k);
L2 = k*fix(L2/k);

L1_S = L1/k;
L2_S = L2/k;

img = imresize(img,[L1,L2]);
S = zeros(L1_S,L2_S);
figure(1);
subplot(121)
imshow(img)
g = mean2(img);
[h,w]=size(img);
n = 1;

i1 = 0;j1 = 0;


for i=1:L1_S
for j=1:L2_S
nn_i = (1:k)+(i-1)*k;
nn_j = (1:k)+(j-1)*k;
imblock=img(nn_i,nn_j);
if nnz(imblock>g)>0
S(i,j) = sum(imblock(imblock>g));
else
S(i,j) = k * g;
end
end
end
subplot(122)
imshow(S,[],'InitialMagnification','fit')

sama.fa
شنبه 09 خرداد 1394, 16:23 عصر
این کد blkproc در اکتاو هست شما این را در فایلی به نام بذارید و نام blkproc را در برنامه بالا به octblkproc تغییر بدید ببینیم اجرا می شه یا نه.

function B = octblkproc(A, varargin)
if(nargin<3)
error('blkproc: invalid number of parameters.');
end

%% check 'indexed' presence
indexed=false;
p=1;
if(ischar(varargin{1}) && strcmp(varargin{1}, 'indexed'))
indexed=true;
p = p + 1;
if(isa(A,'uint8') || isa(A,'uint16'))
padval=0;
else
padval=1;
end
else
padval=0;
end

%% check [m,n]
if(~isvector(varargin{p}))
error('blkproc: expected [m,n] but param is not a vector.');
end
if(length(varargin{p})~=2)
error('blkproc: expected [m,n] but param has wrong length.');
end
sblk=varargin{p}(:);
p= p + 1;

%% check [mborder,nborder]
if(nargin<p)
error('blkproc: required parameters haven't been supplied.');
end

if(isvector(varargin{p}) && isnumeric(varargin{p}))
if(length(varargin{p})~=2)
error('blkproc: expected [mborder,nborder] but param has wrong length.');
end
sborder=varargin{p}(:);
p = p + 1;
else
sborder=[0;0];
end

%% check fun
%% TODO: add proper checks for this one
if(nargin<p)
error('blkproc: required parameters haven't been supplied.');
end

fun=varargin{p};
if(~isa(fun,'function_handle') &&
~isa(fun,'inline function') &&
~ischar(fun))
error('blkproc: invalid fun parameter.');
end

%% remaining params are params to fun
%% extra params are p+1:nargin-1

%% First of all we calc needed padding which will be applied on bottom
%% and right borders
%% The '-' makes the function output needed elements to fill another
%% block directly
sp=mod(-size(A)',sblk);

if(any(sp))
A=padarray(A,sp,padval,'post');
end

%% we store A size without border padding to iterate later
soa=size(A);

%% If we have borders then we need more padding
if(any(sborder))
A=padarray(A,sborder,padval);
end

%% calculate end of block
eblk=sblk+sborder*2-1;

%% now we can process by blocks
%% we try to preserve fun return type by concatenating everything
for i=1:sblk(1):soa(1)
%% This assures r has the same class as returned by fun
r=feval(fun,A(i:i+eblk(1),1:1+eblk(2)),varargin{p+ 1:nargin-1});
for j=1+sblk(2):sblk(2):soa(2)
r=horzcat(r,feval(fun,A(i:i+eblk(1),j:j+eblk(2)),v arargin{p+1:nargin-1}));
end
if(i==1) %% this assures B has the same class as A
B=r;
else
B=vertcat(B,r);
end
end
end


این تابع در متلب خطا میده

rahnema1
شنبه 09 خرداد 1394, 21:29 عصر
این دستور ها را بزنید چه نتیجه ای چاپ می شه؟
img = imread('1.png');
disp(size(img))
disp(class(img))

sama.fa
سه شنبه 12 خرداد 1394, 13:32 عصر
این دستور ها را بزنید چه نتیجه ای چاپ می شه؟
img = imread('1.png');
disp(size(img))
disp(class(img))

من این دستور اجرا کردم اینم نتیجه بعدش چیکار کنم؟؟؟

img = imread('D:\image\roz.png');
disp(size(img))
disp(class(img))
113 91 3

uint8

rahnema1
سه شنبه 12 خرداد 1394, 15:00 عصر
عکس 1 را گفتم همون مرد کچل عینکی

sama.fa
سه شنبه 12 خرداد 1394, 17:49 عصر
اینم مرد کچل خب بعدش چیکار کنم:


img = imread('D:\image\1.png');

disp(size(img))
disp(class(img))
112 92

uint8
>>

rahnema1
سه شنبه 12 خرداد 1394, 18:27 عصر
شما همون برنامه را فکر کنم با roz.png اجرا کرده بودید که خطای Subscripted assignment dimension mismatch. میداد. لطفا با عکس همون مرد کچل ااجراکنید فکر نکنم خطا بده حالا اگه خطا داد احتمالا تصویر rgb بوده که باید به تصویر تک رنگ خاکستری تبدیل بشه
حالا این را امتحان کنید دیگه فکر نکنم خطا بده

clc
clear
close all
img = imread('1.png');
if size(img , 3) == 3
img = rgb2gray(img);
end
img = double(img);
figure;
subplot(221)
imshow(img)
g = mean2(img);
img_gt_g = img > g;
k=16;
S = blkproc (img_gt_g,[k k], @(x) sum(x(:)));
S(S==0) = k *g;

subplot(2,2,2)
imshow(S,[],'InitialMagnification','fit')

sama.fa
سه شنبه 12 خرداد 1394, 22:36 عصر
ممنون از راهنمایی .فقط یه سوال منظور این چند سطر چیه؟؟؟؟

if size(img , 3) == 3
img = rgb2gray(img);
end
img = double(img);

واینکه گفته::

1.میانگین تصویرG
2.برای هر بلوک B از اندازه K*K پیکسل های بزرگتر از عدد میانگین بدست آمده که اول میانگین را حساب بعد جمع میکند و درداخل S قرار می دهد
3.اگر پیکسلی وجود نداشت S=K*G که در آن K ثابت Kدر اینجا بعنوان اندازه بلوک در نطر گرفته میشود
4.S را بعنوان یه ویژگی توی بردار ستونی ذخیره می کنیم
5.مرحله 2تا4را برای بلوک های دیگر هم تکرار میشود


کلیه مراحل که من تو کد قبلی نوشته بودم تواین کد همه این مراحل ذکر نشده ؟؟؟!!

rahnema1
سه شنبه 12 خرداد 1394, 22:59 عصر
تابع blkproc جوری تنظیم شده که فقط با تصاویر خاکستری کار می کنه یعنی تصاویری که دو بعدی هستند
اما تصاویر رنگی در واقع سه بعدی هستند یعنی برای هر رنگ ما تصویر جداگانه داریم
شما سایز را برای هم تصویر خانم و هم مرد کچل زدید اطلاعاتی که چاپ شد برای عکس زن این بود:
113 91 3
یعنی یک عکس 113 در 91 که برای هر رنگ 3 تصویر داریم
اما عکس مرد کچل این جور بود:
112 92
یعنی شامل فقط یک تصویر بود ( یعنی همون چیزی که blkproc انتظار اون را داشت)
حالا با تابع rgb2gray می تونیم تصویر خانم را مثل مرد کچل کنیم که ترکیب سه تایی را به یک عکس تبدیل کنه که متناسب با ورودی blkproc بشه
اون double که زدم شاید اینجا لازم نباشه. ولی در کل بد نیست وقتی می خواهیم روی تصویر عملیات ریاضی انجام بدیم این کار صورت بگیره تا محاسبات دقیق تر بشه
تمام این مراحل که ذکر کردید در این برنامه پیاده کردم. حلقه ها را برداشتم به جای اون blkproc گذاشتم

sama.fa
سه شنبه 12 خرداد 1394, 23:31 عصر
ممنون و سپاس از شما

فقط یه سوال مرحله 4و5 یعنی بردار ستون وتکرار بلوک های دیگر منظوراینه؟؟؟ ((:)sum(x

rahnema1
سه شنبه 12 خرداد 1394, 23:38 عصر
S در واقع در یک ماتریس ذخیره شده نه در یک بردار
بنابراین در پایان همه کدها می تونیم بذاریم که شکل بردار ستونی به خودش بگیره
S_bordar= S(:);

sama.fa
سه شنبه 12 خرداد 1394, 23:43 عصر
در این کد پس مرحله 5 یعنی بلوک های دیگر هم ذکر شده؟؟؟؟؟؟

rahnema1
سه شنبه 12 خرداد 1394, 23:46 عصر
بله محاسبه برای تمام بلوکها صورت گرفته اون هم از طریق blkproc

sama.fa
چهارشنبه 13 خرداد 1394, 00:09 صبح
ممنون در مورد فیلتر بالاگذر گوسی سوالمو اینجا مطرح میکنم برای اینکه از تصویر بردارویژگی فرکانس بالا استخراج کنیم من از فیلتر بالاگذر گوسی بردار استخراج کردم اینم کدش :

میشه بگین آیا کد وطرز استفاده ای که کردم درسته یانه؟؟؟؟؟؟؟؟؟

clc;
clear;

img_orginal=im2double(imread('D:\image\roz.png'));
a=img_orginal;
a = rgb2gray(a);

figure,
subplot(221);
imshow(a),title('main image','fontsize',15);

H =fspecial('gaussian' ,[5 5],2);
hpg= imfilter(a,H);

subplot(222);
imshow(hpg),title('matlab gausian filter','fontsize',15);

[m,n]=size(a);
high_filter=zeros(m,n);
f_transform=fft2(a);
f_shift=fftshift(f_transform);
p=m/2;
q=n/2;
d0=70;
for i=1:m
for j=1:n
distance=sqrt((i-p)^2+(j-q)^2);
high_filter(i,j)=exp(-(distance)^2/(2*(d0^2)));
end
end
temp=high_filter.*f_shift;
x=real(ifft2(double(temp)));

subplot(223);
imshow(x,[]),title('my high pass gaussian filter','fontsize',15);

A=conv2(H,x,'same');
[U R]=eig(A)
B=eig(A)

rahnema1
چهارشنبه 13 خرداد 1394, 00:18 صبح
این کد را از جایی گرفتید؟ اونجا چی گفته بود؟

sama.fa
چهارشنبه 13 خرداد 1394, 00:27 صبح
کد ازیه جایی گرفتم ولی سه سطر اخرشو خودم اضافه کردم برای استخراج بردار ویژگی ولی نمیدونم درست یانه ولی یه کد هم خودم نوشتم که خطا میده ولی اونم دقیق نمیدونم برای استخراج بردار ویژگی هست یانه میشه شما راهنمایی کنید

f=im2double(imread('D:\image\roz.png'));
f = rgb2gray(f);
f=imresize(f,[92 112]);
PQ=paddedsize(size(f));
D0=0.5*PQ(1);
PQ(1)=PQ(2);
H=hpfilter('gaussian',PQ(1),PQ(2),D0);
g=dftfilt(f,H);
figure,imshow(g,[])

rahnema1
چهارشنبه 13 خرداد 1394, 00:37 صبح
حالا من یه بررسی می کنم

sama.fa
چهارشنبه 13 خرداد 1394, 00:42 صبح
ممنون ازشما

rahnema1
چهارشنبه 13 خرداد 1394, 21:01 عصر
چه کسی گفته لازمه از فیلتر بالاگذر گوسی استفاده بشه