一幅768*576的BMP图像,其中有许多分界线,怎么样才能把这些分界线的像素点找到?

解决方案 »

  1.   

    如果分界线是由颜色值固定的象素组成则很容易找到了。
    根据位图的色深(8位,16位)来获取象素数组,然后遍历这个二维数组找到其RGB颜色接近分界线颜色的象素点就可以了。
    比如16位色的位图RGB的分别占5,6,5位,提取出来与分界色的RGB比较就可以了。为了比较接近的颜色,可以比较高位是否相等就可以了。比如比较高4位是否相等,R=11110和分界色的R=11111就很接近。
    int nW=100;//位图的宽
    int nH=100;//位图的高
    DWORD clr;//分界色
    DWORD pix;//位图中取出的点
    DWORD data[nW*nH];//16位色的位图象素数据nW*nH=100×100
    byte r,g,b;//r,g,b颜色分量
    byte r0,g0,b0;//分界色的颜色分量
     r0=clr&0x001f;//取R分量,取5位,可以只取4位,或更少做模糊判断
     g0=clr&0x07e0;//G,取中间6位,可以只取5位
     b0=clr&0xf800;//B,取最后5位,可以只取4位
    for(int i=0;i<nH;i++)
    {
    for(int j=0;j<nW;i++)
    {
     pix=data[i*j+j];//读取一个象素
     r=pix&0x001f;//取R分量,可以只取4位
     g=pix&0x07e0;//G,同上
     b=pix&0xf800;//B,同上
     if(r==r0&&g==g0&&b==b0)
        ;//ok,该点和分界色很接近,保存它的位置,以备使用
    }
    }
      

  2.   

    to:ddmor(小明),分界线的RGB值是不确定的,而且是不可知的啊!还有其他方法吗?
      

  3.   

    to:happy__888([顾问团]寻开心) 能告诉我怎样求阈值吗?我刚接触VC,所以小妹比较笨,望告知!
      

  4.   

    先转换为灰度图,然后统计灰度图,找出阈值
    otsu是一个很有效的求得阈值的算法
      

  5.   

    不知道你的图像是不是黑白分明呢?是的话好办,不是的话我想可以一个一个分析像素点,把他们的RGB值通过公式转化为H值,H好像是亮度之类的,忘了,比如某一点A转化后H = 123(并不一定是这样,有可能小数),然后像上边的大哥说的,设定域值,比如10,那么只要其它点的H值减去123的绝对值大于10,那么认为这个点和点A不是同一颜色,小于10就认为可以算一类颜色。说的不一定对,讨论讨论,这样的话也许能分界,嘿嘿
      

  6.   

    还是谈谈你的具体应用吧。找分界线是为了完成什么任务。
    对分界线的定义还不太清楚。比如从视觉上来比较,至少要满足和原图的对比反差很大吧,比如亮度,色阶,饱和度。那可以将RGB的颜色空间转换到HSL空间,然后找到反差大的颜色做为分界线。
      

  7.   

    楼上都说的差不多了
    补充一句:把你的r,g,b 三色的值加起来除以3就是灰度值了
      

  8.   

    我处理的图象就是8位、24位的BMP灰度图象啊!我现在就是不知道该怎么写代码啊!
      

  9.   

    查找边界有很多现成算法的,sobel算子之类,查查吧。
      

  10.   

    CPoint AB(BYTE CCDData[][768],RECT Range,int ThresholdValue,BOOL SingalMode,int ScanLineNum)
    {
    int i,j,m;
    int data[768];
    int min,max;
    int YValue;
    BOOL flag=TRUE;
    int LineSum,num=10; CPoint Apex; Apex.y=0;
    Apex.x=0; LineSum=(Range.right-Range.left-1);
    YValue=Range.left; int DataTemp[576]; int DataMax,DataMin;
    DataMax=0;
    DataMin=255; for(i=0;i<576;i++)
    {
    DataTemp[i]=0;
    } YValue=Range.left; for(j=Range.left;j<Range.right;j++)
    {
    for(i=Range.top;i<Range.bottom;i++)
    {
    DataTemp[i]=DataTemp[i]+CCDData[i][YValue];
    }
    YValue++;
    } for(i=Range.top;i<Range.bottom;i++)
    {
    DataTemp[i]=(int)(DataTemp[i]/(Range.right-Range.left)); if(DataTemp[i]>DataMax)
    DataMax=DataTemp[i];
    if(DataTemp[i]<DataMin)
    DataMin=DataTemp[i];
    } int FloatThresholdValue;
    FloatThresholdValue=(DataMax+DataMin)/2; YValue=Range.left; if(SingalMode==SINGAL_DRINK)
    {
    for(j=0;j<LineSum;j++)
    {
    data[j]=0;
    for(i=Range.top;i<Range.bottom;i++)
    {
    flag=TRUE;
    for(m=i;m<i+50;m++)
    {
    if(m>=Range.bottom)
    flag=FALSE;
    if(CCDData[m][YValue]>FloatThresholdValue)
    flag=FALSE;
    }
    if(flag)
    {
    data[j]=i;
    break;
    }
    }
    YValue++;
    }
    }
    else//SINGAL_LIGHT
    {
    for(j=0;j<LineSum;j++)
    {
    data[j]=0;
    for(i=Range.top;i<Range.bottom;i++)
    {
    flag=TRUE;
    for(m=i;m<i+50;m++)
    {
    if(CCDData[m][YValue]<FloatThresholdValue)
    flag=FALSE;
    }
    if(flag)
    {
    data[j]=i;
    break;
    }
    }
    YValue++;
    }
    } min=data[0];
    max=data[0]; for(i=1;i<LineSum;i++)
    {
    if((data[i]-data[i-1])>3)
    continue; if(data[i]>max)
    {
    max=data[i];
    Apex.y=max;
    Apex.x=i+Range.left;
    }
    } return Apex;
    }谁能告诉我这一段代码是什么意思,完成了什么功能?谢了!