-
تصحیح خطاIndex exceeds matrix dimensions
باسلام من میخوام تصویر به اندازه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
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
در ضمن من این کد برای یه پایگاه داده تصویر می خوام نه یه دونه تصویر.حالا چطور میتونم بلوک بندیش کنم؟؟؟؟
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
سلام
به این صورت تصویر به دست میاد
در نسخه های جدیدتر متلب به جای 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')
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
نقل قول:
نوشته شده توسط
rahnema1
سلام
به این صورت تصویر به دست میاد
در نسخه های جدیدتر متلب به جای 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;
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
باسلام ممنون از پاسختون ولی بازم ارور میده
Subscripted assignment dimension mismatch.
Error in blkproc (line 92)
aa(border(1)+(1:ma),border(2)+(1:na)) = a
وبرای بلوک های بعدی که من تو کد قبلی قراردادم بقیه کد قرارداده نشده
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
من که با چند تا عکس مختلف با سایزهای مختلف امتحان کردم ( البته در نرم افزار octave ) مشکلی وجود نداشت اگه بتونید عکس را بفرستید تا امتحان کنم
این برنامه برای تمام بلاکها انجام میده در واقع با حذف حلقه ها کار سریعتر شده
-
1 ضمیمه
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
مثلا این تصویر ولی کلا رو چندتاتصاویرپایگاه داده میخوام کد اجرا شه
ضمیمه 131775
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
در نرم افزار 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
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
ممنون ولی من تو نرم افزار متلب میخوام که متاسفانه خطا میده.
ضمنا این کدی که نوشتم ببنین درسته برای بلوک بندی؟؟؟
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')
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
این کد 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
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
من با نرم افزار ocatve کارر نکردم نمیدونم اصلا چیه؟میشه بیشتر راهنمایی کنید؟؟؟ممنون میشم
ضمنا من میخوام بلوک 16*16 هم پوشان باشه
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
نگفتم از ocatve استفاده کنید گفتم به جای blkproc از این تابعی که در بالا گذاشتم استفاده کنید که اسمش octblkproc هست . همپوشان هم میشه به راحتی انجام داد شما فعلا این تابع را اجرا کنید
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
این کد برای بلوک بندی 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')
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
نقل قول:
نوشته شده توسط
rahnema1
این کد 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
این تابع در متلب خطا میده
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
این دستور ها را بزنید چه نتیجه ای چاپ می شه؟
img = imread('1.png');
disp(size(img))
disp(class(img))
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
نقل قول:
نوشته شده توسط
rahnema1
این دستور ها را بزنید چه نتیجه ای چاپ می شه؟
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
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
عکس 1 را گفتم همون مرد کچل عینکی
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
اینم مرد کچل خب بعدش چیکار کنم:
img = imread('D:\image\1.png');
disp(size(img))
disp(class(img))
112 92
uint8
>>
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
شما همون برنامه را فکر کنم با 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')
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
ممنون از راهنمایی .فقط یه سوال منظور این چند سطر چیه؟؟؟؟
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را برای بلوک های دیگر هم تکرار میشود
کلیه مراحل که من تو کد قبلی نوشته بودم تواین کد همه این مراحل ذکر نشده ؟؟؟!!
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
تابع blkproc جوری تنظیم شده که فقط با تصاویر خاکستری کار می کنه یعنی تصاویری که دو بعدی هستند
اما تصاویر رنگی در واقع سه بعدی هستند یعنی برای هر رنگ ما تصویر جداگانه داریم
شما سایز را برای هم تصویر خانم و هم مرد کچل زدید اطلاعاتی که چاپ شد برای عکس زن این بود:
113 91 3
یعنی یک عکس 113 در 91 که برای هر رنگ 3 تصویر داریم
اما عکس مرد کچل این جور بود:
112 92
یعنی شامل فقط یک تصویر بود ( یعنی همون چیزی که blkproc انتظار اون را داشت)
حالا با تابع rgb2gray می تونیم تصویر خانم را مثل مرد کچل کنیم که ترکیب سه تایی را به یک عکس تبدیل کنه که متناسب با ورودی blkproc بشه
اون double که زدم شاید اینجا لازم نباشه. ولی در کل بد نیست وقتی می خواهیم روی تصویر عملیات ریاضی انجام بدیم این کار صورت بگیره تا محاسبات دقیق تر بشه
تمام این مراحل که ذکر کردید در این برنامه پیاده کردم. حلقه ها را برداشتم به جای اون blkproc گذاشتم
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
ممنون و سپاس از شما
فقط یه سوال مرحله 4و5 یعنی بردار ستون وتکرار بلوک های دیگر منظوراینه؟؟؟ ((:)sum(x
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
S در واقع در یک ماتریس ذخیره شده نه در یک بردار
بنابراین در پایان همه کدها می تونیم بذاریم که شکل بردار ستونی به خودش بگیره
S_bordar= S(:);
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
در این کد پس مرحله 5 یعنی بلوک های دیگر هم ذکر شده؟؟؟؟؟؟
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
بله محاسبه برای تمام بلوکها صورت گرفته اون هم از طریق blkproc
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
ممنون در مورد فیلتر بالاگذر گوسی سوالمو اینجا مطرح میکنم برای اینکه از تصویر بردارویژگی فرکانس بالا استخراج کنیم من از فیلتر بالاگذر گوسی بردار استخراج کردم اینم کدش :
میشه بگین آیا کد وطرز استفاده ای که کردم درسته یانه؟؟؟؟؟؟؟؟؟
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)
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
این کد را از جایی گرفتید؟ اونجا چی گفته بود؟
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
کد ازیه جایی گرفتم ولی سه سطر اخرشو خودم اضافه کردم برای استخراج بردار ویژگی ولی نمیدونم درست یانه ولی یه کد هم خودم نوشتم که خطا میده ولی اونم دقیق نمیدونم برای استخراج بردار ویژگی هست یانه میشه شما راهنمایی کنید
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,[])
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
-
نقل قول: تصحیح خطاIndex exceeds matrix dimensions
چه کسی گفته لازمه از فیلتر بالاگذر گوسی استفاده بشه