花如月 发表于 2007-11-1 15:31

特殊矩阵的初始化问题

已知矩阵的大小N*N(这里取N=16)和0元素带的宽度d(这里取d=2)

要得到8个相同大小的矩阵,这个8个矩阵满足在0,22.5,45,67.5,90,112.5,135,157.5度方向上近似为0

其他地方为1,0度和90度的最简单可以这样初始化:
A=ones(16),A(8:9,:)=0;%0度
A=ones(16),A(:,8:9)=0;%90度

其他方向的怎么快速初始化?不必多么的精确,大致差不多就行。我思考好久了,不过一直没有想到什么好的办法。
因此拿出来讨论下,集思广益!大家就都发挥下自己的聪明才智吧!

无水1324 发表于 2007-11-1 22:02

回复 #1 花如月 的帖子

不好意思,我还是没有看懂。只能帮你顶上去了

花如月 发表于 2007-11-1 22:08

回复 #2 无水1324 的帖子

是不是我没表述清楚?

是带状矩阵生成,16*16

宽2个像素的0元素带,方向分别为0,22.5,45,67.5,90,112.5,135,157.5度

0像素带之外的元素都是1

无水1324 发表于 2007-11-1 22:10

清楚了,但是我水平有限哈
你说得东西太专业了

eight 发表于 2007-11-1 22:47

原帖由 花如月 于 2007-11-1 22:08 发表 http://www.chinavib.com/forum/images/common/back.gif
是不是我没表述清楚?

是带状矩阵生成,16*16

宽2个像素的0元素带,方向分别为0,22.5,45,67.5,90,112.5,135,157.5度

0像素带之外的元素都是1

带状矩阵的生成有个专门的帖子的,不过貌似对你的问题帮助不大,因为你的方向太多了,呵呵

bainhome 发表于 2007-11-2 11:44

原矩阵等分四块,相当于分处坐标轴四象限,第一象限内8×8矩阵每个元素列号除以行号(是8×8子矩阵的列、行号)第二象限内8×8矩阵列号除以负行号,依此类推——当然,矩阵内的行、列号要进行必要翻转,使之成为坐标值,即:左下角为最小坐标值。例如第一象限翻转行号。
最后将所得编号矩阵转化为角度,第三、四象限内的角度减180°,按roundn逻辑判断。

未实验,可能还有大问题,如下为四分矩阵角度:clc
%% 矩阵按角度划带
clc
% 第一象限
x1=ones(8,1)*
y1=flipud(x1')
k1=180/pi*(atan(y1./x1))
% 第二象限
x2=-fliplr(ones(8,1)*)
y2=y1
k2=180+180/pi*(atan(y2./x2))
% 第三象限
x3=x2
y3=-flipud(y2)
k3=180/pi*(atan(y3./x3))
% 第四象限
x4=x1
y4=y3
k4=180+180/pi*(atan(y4./x4))
至于角度大小和坐标可以自己调整,上述只是个意思

[ 本帖最后由 bainhome 于 2007-11-2 12:38 编辑 ]

花如月 发表于 2007-11-2 12:53

前辈的方法我还没有完全领会。下边是我的解决办法,比较笨。由于速度比较慢,因此做成了子函数。在需要的时候,可以直接生成大小为n,0像素带宽为d的矩阵供使用function md=matdge(n,d)
k=ones(n,n,8);
=meshgrid(1:n);
o=floor((n+1)/2);
if mod(d,2)==0
    b=o-d/2:o+d/2-1;
else
    b=o-floor(d/2):o+floor(d/2);
end
C=ones(n);C(b,:)=0;
ang=22.5:22.5:157.5;
for i=1:length(ang)
    d=imrotate(C,ang(i),'crop');
    d(((X-o).^2+(Y-o).^2)>o^2-15)=1;
    k(:,:,8-i)=d;
    %figure,imshow(d)
end
md=k;n是要生成矩阵的大小,d是0像素带的宽度,主要使用了图像的旋转函数来完成。
因为程序的总体效率不高,所以希望能看到更有效的方案。

[ 本帖最后由 花如月 于 2007-11-4 14:12 编辑 ]

花如月 发表于 2007-11-2 13:28

回复 #6 bainhome 的帖子

您的思路很好,刚才试了下,可惜编程能力差。
实现不了:@L

不知道用你的方法做出来的效果如何?

bainhome 发表于 2007-11-2 18:40

%% 矩阵按角度划带
clc
% 第一象限
x1=ones(8,1)*-1+eps;
y1=flipud(x1');
k1=180/pi*(atan(y1./x1));
k12=k1;
k12(k12<0.1|(k12>20&k12<25)|(k12>44&k12<46)|(k12>65&k12<70)|(k12>89&k12<91)|...
    (k12>110&k12<115)|(k12>134&k12<136)|(k12>155&k12<160))=0
% 第二象限
x2=-fliplr(x1);
y2=y1;
k2=180+180/pi*(atan(y2./x2));
k2(k2>179)=0
k11=k2;
k11(k11<0.1|(k11>20&k11<25)|(k11>44&k11<46)|(k11>65&k11<70)|(k11>89&k11<91)|...
    (k11>110&k11<115)|(k11>134&k11<136)|(k11>155&k11<160))=0
% 第三象限
x3=x2;
y3=-flipud(y2);
k3=180/pi*(atan(y3./x3));
k21=k3;
k21(k21<0.1|(k21>20&k21<25)|(k21>44&k21<46)|(k21>65&k21<70)|(k21>89&k21<91)|...
    (k21>110&k21<115)|(k21>134&k21<136)|(k21>155&k21<160))=0
% 第四象限
x4=x1;
y4=y3;
k4=180+180/pi*(atan(y4./x4));
k22=k4;
k22(k22>179)=0;
k22(k22<0.1|(k22>20&k22<25)|(k22>44&k22<46)|(k22>65&k22<70)|(k22>89&k22<91)|...
    (k22>110&k22<115)|(k22>134&k22<136)|(k22>155&k22<160))=0
K=;
K(K~=0)=1结果:
K =
K =
   0   1   1   1   0   1   1   0   0   1   1   0   1   1   1   0
   1   0   1   1   1   1   1   0   0   1   1   1   1   1   0   1
   1   1   0   1   1   0   1   0   0   1   0   1   1   0   1   1
   1   1   1   0   1   1   1   0   0   1   1   1   0   1   1   1
   0   1   1   1   0   1   1   0   0   1   1   0   1   1   1   0
   1   1   0   1   1   0   1   0   0   1   0   1   1   0   1   1
   1   1   1   1   1   1   0   0   0   0   1   1   1   1   1   1
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   1   1   1   1   1   1   0   0   0   0   1   1   1   1   1   1
   1   1   0   1   1   0   1   0   0   1   0   1   1   0   1   1
   0   1   1   1   0   1   1   0   0   1   1   0   1   1   1   0
   1   1   1   0   1   1   1   0   0   1   1   1   0   1   1   1
   1   1   0   1   1   0   1   0   0   1   0   1   1   0   1   1
   1   0   1   1   1   1   1   0   0   1   1   1   1   1   0   1
   0   1   1   1   0   1   1   0   0   1   1   0   1   1   1   0
仍然是个大概的意思,划分角度的精度、参数化的事情请自行修改,另外对于行、列数不能被四整除的方阵我没有考虑

[ 本帖最后由 bainhome 于 2007-11-2 18:43 编辑 ]

fsnow 发表于 2007-11-3 16:41

能否将其写成一个可以生成任意多个角度和条带宽度的矩阵的函数?

花如月 发表于 2007-11-3 19:39

回复 #10 fsnow 的帖子

7楼的程序就可以,虽然效率有些低。不过好像是我能想到的最简洁,而且精确度较好的办法。我目前用的就是这个,bainhome的方法除了水平和垂直外,其他方向的0元素带宽都是1,最终的效果不好。

也试过最笨的方法,就是直接给每个方向赋值。缺点是灵活度差,而且出来的准确度也没有旋转矩阵产生的效果好。我用这个东西主要是为了做出一幅指纹图像的块方向图,在不少资料上都看的有。不过并没有讲其具体的绘制方法,如果哪位版友还有更好的生成办法,希望可以分享一下。
页: [1]
查看完整版本: 特殊矩阵的初始化问题