purplesapple 发表于 2007-4-27 10:50

求助程序优化

=size(a);
T=m*n;
a1=0
for ii=1:256
    for jj=1:256
      I0(ii,jj)=0;
      for i=1:m
            for j=1:n
                for k=1:m
                  for l=1:n
                        if (a(i,j)==(ii-1))&(a(k,l)==(jj-1))
                            I0(ii,jj)=I0(ii,jj)+1;
                            a1=a1+1;
                        end
                  end
                end
            end
      end
    end
end;
其中M=150,N=131;
这个对一幅灰度图像求它的二维联合分布密度的程序,但是运行速度十分慢.
请教各位高手有什么优化的办法吗?
再次谢谢大家了

eight 发表于 2007-4-27 10:56

原帖由 purplesapple 于 2007-4-27 10:50 发表 http://forum.vibunion.com/forum/images/common/back.gif
=size(a);
T=m*n;
a1=0
for ii=1:256
    for jj=1:256
      I0(ii,jj)=0;
      for i=1:m
            for j=1:n
                for k=1:m
                  for l=1:n
            ...


建议先阅读关于矢量化技巧的置顶贴,看有否收获

purplesapple 发表于 2007-4-27 11:06

谢谢你的建议!现在正在学习中!

purplesapple 发表于 2007-4-28 22:54

高手能把矢量化具体点吗?看了那个帖子,但是还是不太明白

谢谢指点!

purplesapple 发表于 2007-4-29 13:46

请高手们帮帮忙

eight 发表于 2007-4-29 13:52

原帖由 purplesapple 于 2007-4-29 13:46 发表 http://forum.vibunion.com/forum/images/common/back.gif
请高手们帮帮忙

把原始算法的思想整理一下贴上来吧,不然谁能看懂你的程序?

purplesapple 发表于 2007-4-29 18:04

二维直方图是基于象素之二维联合分布密度定义得到的.设(i,j),(k,l)两个任意象素点上的灰度值分别为g(i,j)和g(k,l),其值分别假设为a,b,则图像灰度值的联合分布密度表示为
P(a,b)=Pk{g(i,j)=a,g(k,l)=b}.其中a,b均为0到L-1之间的灰度整量电平.
我想求一幅灰度图象的二维联合密度。
我首先求出这幅图象的大小,也就是m,n。此外,这幅灰度图象是unint8型,那它的灰度级就是256个灰度级。根据上面关于二维联合分布密度的定义。即是要求得到这幅图中同时满足像素值为a和像素值为b的点的数量。程序中的ii,jj即是相关的a,b值,它可以为0到255之间的任意数(也可以理解为我用ii作为横坐标,jj作为纵坐标)。设置了a,b的值后,我就用个FOR循环来寻找图象中能够同时满足像素值为a和像素值为b的点(即为IF语句后的条件),当满足条件时,那么在该点上加一,就能统计出同时满足a,b的点的数量。因为a,b可以取不同的值,那么就能得出一个256*256大小的矩阵,也就是我想要的二维联合分布密度。
但是用FOR循环实现这个运行速度十分慢。
请教一下有没有什么优化的方法!

谢谢楼上的!

purplesapple 发表于 2007-4-30 16:44

谢谢大家帮忙!

eight 发表于 2007-4-30 16:59

要求得到这幅图中同时满足像素值为a和像素值为b的点的数量

这个是什么意思?一个点的像素值不是固定的吗?任意两点的像素值分别为a、b吧?

[ 本帖最后由 eight 于 2007-4-30 17:06 编辑 ]

eight 发表于 2007-4-30 17:50

看得不是很懂,其实你外加一个简单例子来说明就可以了。如果
A =
   1   2   3
   2   3   6
   6   4   5
   1   1   3则:
B =
   3   6   9   3   3   6
   6   2   6   2   2   4
   9   6   3   3   3   6
   3   2   3   1   1   2
   3   2   3   1   1   2
   6   4   6   2   2   2
是吗?

[ 本帖最后由 eight 于 2007-4-30 17:52 编辑 ]

purplesapple 发表于 2007-4-30 23:19

对呀!就是这个意思~
你这样就清楚明白多了。学习到以后怎么样把问题说清楚了!谢谢你!

就是这个意思,如果象你举的例子一样,矩阵小的话我那样的实现方法运行起来就没有什么问题,但是针对一幅图象而言,那样的循环方式就会让程序的运行速度大大降低!
 
所以请您指点一下,有没有什么优化的方法!

十分感谢!

eight 发表于 2007-4-30 23:21

原帖由 purplesapple 于 2007-4-30 23:19 发表 http://forum.vibunion.com/forum/images/common/back.gif
对呀!就是这个意思~
你这样就清楚明白多了。学习到以后怎么样把问题说清楚了!谢谢你!

就是这个意思,如果象你举的例子一样,矩阵小的话我那样的实现方法运行起来就没有什么问题,但是针对一幅图象而言, ...

你终于上来回复了,呵呵。我等了一个晚上了,之前在实验室写好了程序,不过走的时候忘记带回来了。我现在看能否重复一下,不行的话可能要等明天或者后天了

eight 发表于 2007-4-30 23:55

程序:A = ;
B = unique(A);
C = hist(double(A(:)), double(length(B)));
D = C'*C;
E = -diag(diag(D))+D;
E = diag(C) + E;
A
E结果:
A =
   1   2   3
   2   3   6
   6   4   5
   1   1   3

E =
   3   6   9   3   3   6
   6   2   6   2   2   4
   9   6   3   3   3   6
   3   2   3   1   1   2
   3   2   3   1   1   2
   6   4   6   2   2   2

[ 本帖最后由 eight 于 2007-5-1 00:18 编辑 ]

purplesapple 发表于 2007-5-1 09:42

谢谢~~~
我照你的方法改下我的程序!要是有问题再请教你哈!

十分感谢!

purplesapple 发表于 2007-5-1 23:32

为什么通过最后的取对角元以及通过一维数组的扩展就能得到要求得的统计数值呢

最后两句的具体思想是什么啊?

谢谢!
页: [1] 2
查看完整版本: 求助程序优化