您的位置:程序门 -> vc/mfc -> 图形处理/算法



(送分了)如何求出黑白16位bmp格式图片中的最亮点?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


(送分了)如何求出黑白16位bmp格式图片中的最亮点?[已结贴,结贴人:koieysky]
发表于:2007-01-15 15:32:46 楼主
我有几张黑色图片,里面有许多点,如何求出里面最亮的一个?最好有例子。。
-------------------------------------
原本我是把16位转换成24位来运算
以下是我原来的算法:
  unsigned   char   ds   =   0x0;
  for   (   m   =   0;   m   <   pmblen;   m++   )
  {
byte   c,r,g,b;
c=(pmb[m] < <8)+pmb[m+1];
r=(c&0x7c00)> > 10;
g=(c&0x03e0)> > 5;
b=c&0x001f;
ds=max(ds,max(max(r,g),b));

  }
(这样求值很占内存,而且结果不怎么对。有没有办法直接用16位进行分析?)

发表于:2007-01-15 15:54:241楼 得分:0
原代码为:
----------------------
cfile   sf;
long   hin   =   0;
sf.open( "e:\\captmp.bmp ",cfile::moderead);
sf.seek(10,cfile::begin);
sf.read(&hin,sizeof(int));

sf.seek(hin,cfile::begin);

unsigned   char   *pmb   =   (unsigned   char   *)malloc(sf.getlength()   -   hin);
memset(pmb,0,sizeof(unsigned   char)   *   sf.getlength()   -   hin);

sf.read(pmb,sf.getlength()   -   hin);

unsigned   char   ds   =   0x0;
long   m,pmblen   =   sf.getlength()   -   hin;

//-----------求最亮点------------------
  for   (   m   =   0;   m   <   pmblen;   m++   )
  {
byte   c,r,g,b;
  c=(pmb[m] < <8)+pmb[m+1];
r=(c&0x7c00)> > 10;
  g=(c&0x03e0)> > 5;
    b=c&0x001f;
  ds=max(ds,max(max(r,g),b));

  }

sf.seek(10,cfile::begin);
sf.read(&hin,sizeof(int));  
int   gw,gh;
sf.seek(4,cfile::current);
sf.read(&gw,sizeof(int));  
sf.read(&gh,sizeof(int));  

sf.seek(hin,cfile::begin);

int   x   =   gw   ,   y   =   gh   ,   bufsize;
int isscrx   =   0   ,   isscry   =   0;  

bool   xf,yf;
unsigned   char   *pb;

xf   =   yf   =   false;

bufsize   =   sizeof(unsigned   char)   *   gw   *   3;
pb   =   (unsigned   char   *)malloc(bufsize);

while   (   y   !=   0   )
{
memset(pb,0,bufsize);
sf.read(pb,bufsize);    

for   (   int   j   =   0;   j   <   bufsize;   j   +=   3   )
{
if   (   pb[j]   ==   ds   ¦ ¦   pb[j   +   1]   ==   ds   ¦ ¦   pb[j   +   2]   ==   ds   )
{
x   =   (j   +   1)   /   3;
xf   =   true;
break;
}
}

if   (   xf   ==   true   )
{
yf   =   true;
break;
}

y   -=   1;
}

if   (xf   ==   true   &&   yf   ==   true)
{
isscrx   =   (int)(x   *   2.5);  
isscry   =   (int)(y   *   2.5);  
}

free(pb);
free(pmb);
sf.close();
---------------------------
求出的isscrx   ,isscry   为此亮点在图片中的位置。
可是算出来的结果不对。
-------------------------
后来我改成:
  for   (   m   =   0;   m   <   pmblen;   m++   )
  {
                    ds   =   (pmb[m]   >   ds   ?   pmb[m]   :   ds);
  }
结果也不对。高手请指点指点.
发表于:2007-01-15 16:35:502楼 得分:0
我在顶
发表于:2007-01-16 09:51:323楼 得分:0
晕到,没人帮?
发表于:2007-01-17 06:21:024楼 得分:0
...
发表于:2007-01-17 09:56:475楼 得分:0
我把16位的颜色提取出来转换成24位。
或者有其他方法。
就是求16位黑色bmp图片中的最亮点,然后找出这亮点在图片中的位置。
发表于:2007-01-17 10:00:126楼 得分:0
我猜不到的图片到底是什么样子,黑白图片只有2个颜色,   无所谓最亮,
因此不是2色黑白。

16位的灰度(r=b=g)图片,楼主的程序应该能找到最亮,不过灰度图片基本上不需要16位

16位的彩色图片,   楼主都说是黑白的了。

发表于:2007-01-17 15:21:567楼 得分:20
为此,ntsc制作出规定;显象三基色各为1单位时,能相混出1光瓦和c白,即
1   +1[   +1   =   (1光瓦)   (2.4-1)
显象三基色单位是   、   、   ,若用xyz制表示,则
  (2.4-2)
所以  
  (1光瓦)   (2.4-3)
在xyz计色制中,若已知1光瓦c白的色度坐标   的值(见表2-5),则可以求出它的三色系数   。令
    (2.4-4)
 
将c白的色坐标  
发表于:2007-01-17 15:27:068楼 得分:30
链接:
http://www.3811111.com/dzjx/dsxjs/2-4.html
发表于:2007-01-17 22:13:199楼 得分:0
以下算法求出来的最亮值为31.
因为是黑白摄像机抓的图,是16位的黑白bmp图片。
原代码修改后也不正确....
-------------------
有人说,555最亮值是31不知对不对,有人说565的最亮值为63。
-------------------
cfile   sf;
long   hin   =   0;
sf.open( "e:\\captmp.bmp ",cfile::moderead);
sf.seek(10,cfile::begin);
sf.read(&hin,sizeof(int));
sf.seek(hin,cfile::begin);

unsigned   char   *pmb   =   (unsigned   char   *)malloc(sf.getlength()   -   hin);
memset(pmb,0,sizeof(unsigned   char)   *   sf.getlength()   -   hin);

sf.read(pmb,sf.getlength()   -   hin);

unsigned   char   ds   =   0x0;
long   m,pmblen   =   sf.getlength()   -   hin;

//-----------求最亮点------------------
  for   (   m   =   0;   m   <   pmblen;   m++   )
  {
byte   b;
b=pmb[m+1]&0x001f;
ds=max(ds,b);
  }
//------------计算ds在位图中的位置------------------
sf.seek(10,cfile::begin);
sf.read(&hin,sizeof(int));  
int   gw,gh;
sf.seek(4,cfile::current);
sf.read(&gw,sizeof(int));  
sf.read(&gh,sizeof(int));  

sf.seek(hin,cfile::begin);

int   x   =   gw   ,   y   =   gh   ,   bufsize;
intisscrx   =   0   ,   isscry   =   0;  

bool   xf,yf;
unsigned   char   *pb;

xf   =   yf   =   false;

bufsize   =   sizeof(unsigned   char)   *   gw   *   2;
pb   =   (unsigned   char   *)malloc(bufsize);

while   (   y   !=   0   )
{
memset(pb,0,bufsize);
sf.read(pb,bufsize);    

for   (   int   j   =   0;   j   <   bufsize;   j   +=   3   )
{
byte   b;
b=pmb[j+1]&0x001f;
if   (   b   ==   ds   )
{
x   =   (j   +   1)   /   2;
xf   =   true;
break;
}
}

if   (   xf   ==   true   )
{
yf   =   true;
break;
}

y   -=   1;
}

if   (xf   ==   true   &&   yf   ==   true)
{
isscrx   =   (int)(x   *   2.5);  
isscry   =   (int)(y   *   2.5);  
}

free(pb);
free(pmb);
sf.close();


快速检索

最新资讯
热门点击