?求出一个图片里面特定位置像素点的个数?????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 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面