声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3291|回复: 10

[综合讨论] 特殊矩阵的初始化问题

[复制链接]
发表于 2007-11-1 15:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
已知矩阵的大小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度

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

使用道具 举报

发表于 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
发表于 2007-11-1 22:10 | 显示全部楼层
清楚了,但是我水平有限哈
你说得东西太专业了
发表于 2007-11-1 22:47 | 显示全部楼层
原帖由 花如月 于 2007-11-1 22:08 发表
是不是我没表述清楚?

是带状矩阵生成,16*16

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

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


带状矩阵的生成有个专门的帖子的,不过貌似对你的问题帮助不大,因为你的方向太多了,呵呵
发表于 2007-11-2 11:44 | 显示全部楼层
原矩阵等分四块,相当于分处坐标轴四象限,第一象限内8×8矩阵每个元素列号除以行号(是8×8子矩阵的列、行号)第二象限内8×8矩阵列号除以负行号,依此类推——当然,矩阵内的行、列号要进行必要翻转,使之成为坐标值,即:左下角为最小坐标值。例如第一象限翻转行号。
最后将所得编号矩阵转化为角度,第三、四象限内的角度减180°,按roundn逻辑判断。

未实验,可能还有大问题,如下为四分矩阵角度:
  1. clc
  2. %% 矩阵按角度划带
  3. clc
  4. % 第一象限
  5. x1=ones(8,1)*[1:8]
  6. y1=flipud(x1')
  7. k1=180/pi*(atan(y1./x1))
  8. % 第二象限
  9. x2=-fliplr(ones(8,1)*[1:8])
  10. y2=y1
  11. k2=180+180/pi*(atan(y2./x2))
  12. % 第三象限
  13. x3=x2
  14. y3=-flipud(y2)
  15. k3=180/pi*(atan(y3./x3))
  16. % 第四象限
  17. x4=x1
  18. y4=y3
  19. k4=180+180/pi*(atan(y4./x4))
复制代码

至于角度大小和坐标可以自己调整,上述只是个意思

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

评分

1

查看全部评分

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

[ 本帖最后由 花如月 于 2007-11-4 14:12 编辑 ]
 楼主| 发表于 2007-11-2 13:28 | 显示全部楼层

回复 #6 bainhome 的帖子

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

不知道用你的方法做出来的效果如何?
发表于 2007-11-2 18:40 | 显示全部楼层
  1. %% 矩阵按角度划带
  2. clc
  3. % 第一象限
  4. x1=ones(8,1)*[1:8]-1+eps;
  5. y1=flipud(x1');
  6. k1=180/pi*(atan(y1./x1));
  7. k12=k1;
  8. k12(k12<0.1|(k12>20&k12<25)|(k12>44&k12<46)|(k12>65&k12<70)|(k12>89&k12<91)|...
  9.     (k12>110&k12<115)|(k12>134&k12<136)|(k12>155&k12<160))=0
  10. % 第二象限
  11. x2=-fliplr(x1);
  12. y2=y1;
  13. k2=180+180/pi*(atan(y2./x2));
  14. k2(k2>179)=0
  15. k11=k2;
  16. k11(k11<0.1|(k11>20&k11<25)|(k11>44&k11<46)|(k11>65&k11<70)|(k11>89&k11<91)|...
  17.     (k11>110&k11<115)|(k11>134&k11<136)|(k11>155&k11<160))=0
  18. % 第三象限
  19. x3=x2;
  20. y3=-flipud(y2);
  21. k3=180/pi*(atan(y3./x3));
  22. k21=k3;
  23. k21(k21<0.1|(k21>20&k21<25)|(k21>44&k21<46)|(k21>65&k21<70)|(k21>89&k21<91)|...
  24.     (k21>110&k21<115)|(k21>134&k21<136)|(k21>155&k21<160))=0
  25. % 第四象限
  26. x4=x1;
  27. y4=y3;
  28. k4=180+180/pi*(atan(y4./x4));
  29. k22=k4;
  30. k22(k22>179)=0;
  31. k22(k22<0.1|(k22>20&k22<25)|(k22>44&k22<46)|(k22>65&k22<70)|(k22>89&k22<91)|...
  32.     (k22>110&k22<115)|(k22>134&k22<136)|(k22>155&k22<160))=0
  33. K=[k11,k12;k21,k22];
  34. K(K~=0)=1
复制代码
结果:
  1. K =
  2. K =
  3.      0     1     1     1     0     1     1     0     0     1     1     0     1     1     1     0
  4.      1     0     1     1     1     1     1     0     0     1     1     1     1     1     0     1
  5.      1     1     0     1     1     0     1     0     0     1     0     1     1     0     1     1
  6.      1     1     1     0     1     1     1     0     0     1     1     1     0     1     1     1
  7.      0     1     1     1     0     1     1     0     0     1     1     0     1     1     1     0
  8.      1     1     0     1     1     0     1     0     0     1     0     1     1     0     1     1
  9.      1     1     1     1     1     1     0     0     0     0     1     1     1     1     1     1
  10.      0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
  11.      0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
  12.      1     1     1     1     1     1     0     0     0     0     1     1     1     1     1     1
  13.      1     1     0     1     1     0     1     0     0     1     0     1     1     0     1     1
  14.      0     1     1     1     0     1     1     0     0     1     1     0     1     1     1     0
  15.      1     1     1     0     1     1     1     0     0     1     1     1     0     1     1     1
  16.      1     1     0     1     1     0     1     0     0     1     0     1     1     0     1     1
  17.      1     0     1     1     1     1     1     0     0     1     1     1     1     1     0     1
  18.      0     1     1     1     0     1     1     0     0     1     1     0     1     1     1     0
复制代码

仍然是个大概的意思,划分角度的精度、参数化的事情请自行修改,另外对于行、列数不能被四整除的方阵我没有考虑

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

评分

1

查看全部评分

发表于 2007-11-3 16:41 | 显示全部楼层
能否将其写成一个可以生成任意多个角度和条带宽度的矩阵的函数?
 楼主| 发表于 2007-11-3 19:39 | 显示全部楼层

回复 #10 fsnow 的帖子

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

也试过最笨的方法,就是直接给每个方向赋值。缺点是灵活度差,而且出来的准确度也没有旋转矩阵产生的效果好。我用这个东西主要是为了做出一幅指纹图像的块方向图,在不少资料上都看的有。不过并没有讲其具体的绘制方法,如果哪位版友还有更好的生成办法,希望可以分享一下。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-12 08:31 , Processed in 0.069525 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表