?求出一个图片里面特定位置像素点的个数?????100分哦~~~~~~~~~~~~

时间:2008-06-05 14:54:51   来源:论坛整理  作者:  编辑:chinaitzhe


正如上面图片上的黑色区域一样~我想求出这个区域内部的像素点的个数!!!

希望哪位大哥帮我写个程序啊~~~帮帮忙啊~~~~
网友回复:这个黑色区域是叠加在源图层上面的吧
假如这个区域是个圆的话,不是很好计算吗?

不规则图形,那就要有特定的算法了
网友回复:网上搜索一下
网友回复:可以用matlab吧,这样方便很多

一句话就可以读入

但后就全图片扫描,可以获取的
网友回复:一个个像素扫描,看这点的着色值为黑色就加一~~~
网友回复:可以啊 ~~~有没有程序啊?
网友回复:有没有程序啊?急需程序啊~~~
网友回复:扫描线填充算法和区域填充算法


网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



参考以下

#include <graphics.h>

#include <math.h>



#define SCREENX 80

#define SCREENY 80

   

/* 矩阵变换函数---------------------------------------------------------- */

   

/* 生成绕x轴旋转theta角的矩阵Rx */

void matRx(float Rx[4][4],float theta)

{

   int i,j;

   for(i=0;i<4;i  )

       for(j=0;j<4;j  )

          Rx[i][j]=0;

   Rx[0][0]=1; Rx[3][3]=1;

   Rx[1][1]=cos(theta);

   Rx[1][2]=sin(theta);

   Rx[2][1]=-sin(theta);

   Rx[2][2]=cos(theta);

}



/* 生成绕y轴旋转theta角的矩阵Ry */

void matRy(float Ry[4][4],float theta)

{

   int i,j;

   for(i=0;i<4;i  )

       for(j=0;j<4;j  )

          Ry[i][j]=0;

   Ry[1][1]=1;  Ry[3][3]=1;

   Ry[0][0]=cos(theta);

   Ry[0][2]=-sin(theta);

   Ry[2][0]=sin(theta);

   Ry[2][2]=cos(theta);

}



/* 生成绕z轴旋转theta角的矩阵Rz */

void matRz(float Rz[4][4],float theta)

{

   int i,j;

   for(i=0;i<4;i  )

       for(j=0;j<4;j  )

          Rz[i][j]=0;

   Rz[2][2]=1;  Rz[3][3]=1;

   Rz[0][0]=cos(theta);

   Rz[0][1]=sin(theta);

   Rz[1][0]=-sin(theta);

   Rz[1][1]=cos(theta);

}



/* 生成平移(tx,ty,tz)的矩阵Txyz */

void matTxyz(float Txyz[][4],float tx,float ty,float tz)

{

   int i,j;

   for(i=0;i<4;i  )

       for(j=0;j<4;j  )

          Txyz[i][j]=0;

   Txyz[0][0]=1; Txyz[1][1]=1;  Txyz[2][2]=1;  Txyz[3][3]=1;

   Txyz[3][0]=tx; Txyz[3][1]=ty; Txyz[3][2]=tz; 

}



/* 矩阵相乘 R=A*B */

void MatMul(float R[][4],float A[][4],float B[][4])

{

   int i,j,k;

   float AA[4][4],BB[4][4];

   for(i=0;i<4;i  ) {

      for(j=0;j<4;j  ) {

         AA[i][j] = A[i][j]; BB[i][j] = B[i][j]; 

      }

   }

  

   for(i=0;i<4;i  ) {

      for(j=0;j<4;j  ) {

         R[i][j] = 0;  /* float (*R)[4],  *(*(R i) j) = 0; */

         for(k=0;k<4;k  )

            R[i][j] = R[i][j]  AA[i][k]*BB[k][j];

      }

   }

}



/* 向量与矩阵相乘 R=Vector*Mat */

void MVMul(float R[],float Vector[],float Mat[][4])

{

   int i,j,k;

   for(i=0;i<3;i  ) {

      R[i] = 0;

      for(j=0;j<3;j  ) 

         R[i] = R[i]   Vector[j] * Mat[j][i];

      R[i] = R[i]   Mat[3][i];

   }

}





/* 排序,求交等公用函数---------------------------------------------------------- */



/* 从小到大排序 */

void sort(float a[],int n)

{

   int i,j,k;

   float temp;

   for (i=0;i<n;i  ){

      k=i;

      for (j=i 1;j<n;j  )

         if (a[j]<a[k])

            k=j;

      temp = a[i];

      a[i]=a[k];

      a[k]=temp;

   }

}



/* 求扫描线与边AB的交点,假如无交点,返回-1 */

float linejoin(float A[3],float B[3],int y)

{

   float t;

   if (B[1]==A[1])

      return -1;

   

   t = (y-A[1]) / (B[1]-A[1]);

   if (t>=0 && t<=1){

      return A[0]   (B[0]-A[0])*t;

   }else

      return -1;

}



/* 向量的点乘 */

float dot(float A[3],float B[3]){

   return(A[0]*B[0] A[1]*B[1] A[2]*B[2]);

}



/* 向量的叉乘 */

void cross(float R[3],float A[3],float B[3]){

   R[0] = A[1]*B[2] - A[2]*B[1];

   R[1] = A[2]*B[0] - A[0]*B[2];

   R[2] = A[0]*B[1] - A[1]*B[0];

}



/* 求平面P(u,w)=A uB wC与直线Q(t)=D tE的交点R */

int facejoin(float R[3],float A[3],float B[3],float C[3],float D[3],float E[3])

{

   float Temp[3],t;



   cross(Temp,B,C);

   

   if (dot(Temp,E)==0)

      return -1;

   

   t = (dot(Temp,A)-dot(Temp,D)) / dot(Temp,E);

   

   R[0] = D[0]   t*E[0];

   R[1] = D[1]   t*E[1];

   R[2] = D[2]   t*E[2];

   return 1;

}



/* 复制两个向量R=A */

void copyvertex(float R[3],float A[3])

{

  R[0]=A[0];R[1]=A[1];R[2]=A[2];

}



/* 扫描线填充算法---------------------------------------------------------- */

/* 用扫描线算法用颜色c填充由vertex顶点序列定义的多边形区域 */

/* 为了与其它三维点坐标传递参数,这里也统一改用空间点的坐标,而不用float vertex[][2] */

/* 用深度缓存算法进行面消隐 */

void linefill(float vertex[][3],int n,int c,float ZB[][SCREENY],int beginx,int beginy)

{

   int i,j,k,x,y,miny,maxy;

   float A[3],B[3],C[3],D[3],E[3],R[3],temp,join[10];

   

   setcolor(c);

   

   /* 计算该多边形的平面方程P(u,w)=A uB wC,直线方程Q(t)=(x0,y0,0) (0,0,1)t */

   for (i=0;i<3;i  ) {

      A[i]=vertex[0][i];

      B[i]=vertex[1][i]-vertex[0][i];

      C[i]=vertex[2][i]-vertex[0][i];

      

      D[i] = 0;

      E[i] = 0;

   }

   D[2]=0;

   E[2]=1;



   

   /* 找出y坐标最大和最小的顶点 */

   miny=vertex[0][1];maxy=vertex[0][1];

   for (i=0;i<n;i  ){

      if (vertex[i][1]<miny)

         miny=vertex[i][1];

      if (vertex[i][1]>maxy)

         maxy=vertex[i][1];

   }

   

   /* 使扫描线从y坐标最小的递增1到y最大的顶点 */

   for (y=miny;y<=maxy;y  ){

      

      /* 求当前扫描线与每条边的交点 */

      j=-1;

      for (i=0;i<n;i  ) {

         if (y==vertex[(i 1)%n][1]) /* 交点在边的端点 */

            if ((vertex[(i 1)%n][1]-vertex[i][1])*(vertex[(i 1)%n][1]-vertex[(i 2)%n][1])<0) /* 假如是左右顶点,交点算一个 */

               continue;



         temp = linejoin(vertex[i],vertex[(i 1) % n],y);

         if (temp!=-1){

            j  ;

            join[j] = temp;

            

         }

      }

      

      /* 交点排序,填充交点间的扫描线段 */

      sort(join,j 1);

      

      for (k=0;k<=j/2;k  ){

         /* line(join[2*k],y,join[2*k 1],y); */

         

          for (x=join[2*k];x<=join[2*k 1];x  ) {

              D[0]=x; D[1]=y;

              if (facejoin(R,A,B,C,D,E)){ /* 计算平面区域在(x,y)点的深度值R[2] */

                  if (R[2]>ZB[x-beginx][y-beginy]){

                      putpixel(x,y,c);

                      ZB[x-beginx][y-beginy] = R[2];

                  }

              }

          }

          

      }

   }

}

/* --------------------------------------------------------- */








网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



/* 把数据显示在屏幕上 */

void draw(float vertex[][3],int c)

{



   int i,j,minx,miny,c1=RED,c2=YELLOW,c3=BLUE,c4=CYAN,c5=WHITE,c6=GREEN;

   float ZB[SCREENX][SCREENY];

   float thevertex[4][3];

   

   /* 初始化深度缓存数组 */

   for (i=0;i<SCREENX;i  )

      for (j=0;j<SCREENY;j  )

         ZB[i][j] = -1000;

   

   setcolor(c);

   

   /* 画正方体的12条边 */

   moveto(vertex[3][0],vertex[3][1]);

   for (i=0;i<4;i  )

      lineto(vertex[i][0],vertex[i][1]);

   moveto(vertex[7][0],vertex[7][1]);

   for (i=4;i<8;i  )

      lineto(vertex[i][0],vertex[i][1]);

   for (i=0;i<4;i  )

      line(vertex[i][0],vertex[i][1],vertex[i 4][0],vertex[i 4][1]);

   

   /* 找出x,y坐标最小的顶点 */

   minx=vertex[0][0];miny=vertex[0][1];

   for (i=0;i<8;i  ){

      if (vertex[i][0]<minx)

         minx=vertex[i][0];

      if (vertex[i][1]<miny)

         miny=vertex[i][1];

   }

   minx--;miny--;

 

   if (c==BLACK) {c1=BLACK;c2=BLACK;c3=BLACK;c4=BLACK;c5=BLACK;c6=BLACK;}

   

   linefill(vertex,4,c1,ZB,minx,miny);

   linefill(&vertex[4],4,c2,ZB,minx,miny);

   

   /* 复制生成一个面的四个顶点坐标,并进行填充 */

   copyvertex(thevertex[0],vertex[0]);

   copyvertex(thevertex[1],vertex[1]);

   copyvertex(thevertex[2],vertex[5]);

   copyvertex(thevertex[3],vertex[4]);

   linefill(thevertex,4,c3,ZB,minx,miny);

   

   /* 复制生成一个面的四个顶点坐标,并进行填充 */

   copyvertex(thevertex[0],vertex[0]);

   copyvertex(thevertex[1],vertex[3]);

   copyvertex(thevertex[2],vertex[7]);

   copyvertex(thevertex[3],vertex[4]);

   linefill(thevertex,4,c4,ZB,minx,miny);

   

   /* 复制生成一个面的四个顶点坐标,并进行填充 */

   copyvertex(thevertex[0],vertex[2]);

   copyvertex(thevertex[1],vertex[3]);

   copyvertex(thevertex[2],vertex[7]);

   copyvertex(thevertex[3],vertex[6]);

   linefill(thevertex,4,c5,ZB,minx,miny);

   

   /* 复制生成一个面的四个顶点坐标,并进行填充 */

   copyvertex(thevertex[0],vertex[1]);

   copyvertex(thevertex[1],vertex[2]);

   copyvertex(thevertex[2],vertex[6]);

   copyvertex(thevertex[3],vertex[5]);

   linefill(thevertex,4,c6,ZB,minx,miny);

   

}



/* 主函数--------------------------------------------------------- */

main()

{

   int i,j;

   float vertex[][3]={{280,0,20},{280,40,20},{320,40,20},{320,0,20},{280,0,-20},{280,40,-20},{320,40,-20},{320,0,-20}};

   float pvertex[8][3]; /* 旋转变换之后的新坐标 */



   float Rx[4][4],Ry[4][4],Rz[4][4],R[4][4],Txyz[4][4]; /* 旋转平移变换矩阵 */

   float theta;

   

   void matRx(),matRy(),matTxyz(),MatMul(),MVMul(),draw();



  int driver=DETECT,mode;  

  registerbgidriver(EGAVGA_driver);

  initgraph(&driver,&mode,"");

   

   /* 整个场景绕x轴旋转theta角度(也可看作是坐标轴旋转-theta角度),使得z轴的方向和视线方向相同 */

   theta = 3.14/3;

   matRx(Rx,theta);

   

   /* 不断循环动画,直到敲击了一下键盘 */

   while (!kbhit()) { 



      theta = theta   0.1;

      if (theta>6.28)

         theta = 0;



      /* 正方体绕z轴公转theta角度 */

      matRz(Rz,theta);



      MatMul(R,Rz,Rx);

   

      /* 以 (300,240,0) 为中心(固定点)旋转 */

      matTxyz(Txyz,-300,-240,0);

      MatMul(R,Txyz,R);

      matTxyz(Txyz,300,240,0);

      MatMul(R,R,Txyz);



      /* 进行坐标变换 */

      for (i=0;i<8;i  )

         MVMul(pvertex[i],vertex[i],R);

      

      /* 清楚屏幕,画出新的图形 */

      clearviewport();

      draw(pvertex,WHITE);

      

      /* 延迟速度 sleep(1);*/

      for (i=0;i<500;i  ) {

         /* 在中心画个圆并用红色填充(太阳) */

         setcolor(WHITE);

         circle(300,240,20);

         setfillstyle(1,RED);

         floodfill(300,240,WHITE);

      }



      getch();

      /* draw(pvertex,BLACK); 用背景色擦掉刚才所画的所有图形,下一轮循环再在新的地方画图,实现动画 */

      

   }



   getch();

   

   closegraph();

}




网友回复:楼上的....厉害.
我只能想到一个一个象素遍历
网友回复:嗯,不错!
学习了
网友回复:
∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞

力争成为中国最大的架构师群联盟,架构师技术交流群:62402336正式开放!!!

已经上传的顶级软件产品的架构分析,本群资料仅供研究学习,不得商用!!!
google 、
eBay、
Youtube、
淘宝等
......
技术文章包括:
《自己动手写操作系统
《搜索引擎-原理、技术与系统》
《企业应用架构模式》
......
重要的RUP实例
设计模式精解
......
资料陆续上传中
∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞∽∝∞
关键字:求出,一个,图片,里面,特定,
上一篇:RS232串口编程

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面