我把RGB图像用一下程序求相似度,然后求二值图。但二值图的结果不好,为什么
for(i=0; i<m_nHeight; i++)
{
for(j=0; j<m_nWidth; j++)
{
double x1,x2;
TCbCr temp = CalCbCr(m_pSourceData[i][j].rgbRed,m_pSourceData[i][j].rgbGreen,m_pSourceData[i][j].rgbBlue);
x1 = temp.Cb-bmean;
x2 = temp.Cr-rmean;
double t;
t = x1*(x1*brcov[1][1]-x2*brcov[1][0])+x2*(-x1*brcov[0][1]+x2*brcov[0][0]);
t /= (brcov[0][0]*brcov[1][1]-brcov[0][1]*brcov[1][0]);
t /= (-2);
m_pLikeliHoodArray[i][j] = exp(t);
}
} filter(m_pLikeliHoodArray,m_nWidth,m_nHeight); double max = 0.0;
for(i=0; i<m_nHeight; i++)
for(j=0; j<m_nWidth; j++)
if(m_pLikeliHoodArray[i][j] > max) 
max = m_pLikeliHoodArray[i][j];

for(i=0; i<m_nHeight; i++)
{
for(j=0; j<m_nWidth; j++)
{
m_pLikeliHoodArray[i][j] /= max;
}
}

解决方案 »

  1.   

    // 获取文档
    CCh1_1Doc* pDoc =GetDocument();
    HDIB hDIB=pDoc->GetHDIB();
    if(hDIB==NULL)return NULL;
    m_UnDo[++m_UnDoCount]=CopyHandle(hDIB);
    m_bUnDo=true;
    if(m_hHuiDuDIB==NULL)
    {
    CManage CTurnToGray((HDIB)CopyHandle(hDIB));
    m_hHuiDuDIB=CTurnToGray.TurnToGrey();
    }
    //HDIB hColorShold=(HDIB)CopyHandle(hDIB);
    // 指向DIB的指针
    LPSTR lpDIB;
    // 指向DIB象素指针
    LPSTR   lpDIBBits;
    // 锁定DIB
    //lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hColorShold);
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
    if(::DIBBits(lpDIB)!=24)
    {
    MessageBox("不是24位真彩图","警告",MB_ICONINFORMATION | MB_OK);
    return NULL;
    }
    // 更改光标形状
    BeginWaitCursor();
    // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIB);
    int i,j;
    // 图像每行的字节数
    LONG lLineBytes;
    int lWidth,lHeight;
    lWidth=::DIBWidth(lpDIB);
    lHeight=::DIBHeight(lpDIB);
    // 计算图像每行的字节数
    lLineBytes = WIDTHBYTES(lWidth * 8*3);
    CDC *pdc=GetDC();
    unsigned char  red,green,blue;
    red=GetRValue(m_ClickColor);
    green=GetGValue(m_ClickColor);
    blue=GetBValue(m_ClickColor);
    unsigned char * RColor,*GColor,*BColor;
    unsigned long ulDistance;
    for(j=lHeight-1;j>=0;j--)
    for(i=0;i<3*lWidth;i+=3)
    {

    RColor=(unsigned char*)lpDIBBits + lLineBytes *(lHeight-1-j) + i+2;
    GColor=(unsigned char*)lpDIBBits + lLineBytes * (lHeight-1-j)+ i+1;
    BColor=(unsigned char*)lpDIBBits + lLineBytes * (lHeight-1-j) + i;
    ulDistance=3*(*RColor-red)*(*RColor-red)+4*(*GColor-green)*(*GColor-green)+
    2*(*BColor-blue)*(*BColor-blue);
    if(ulDistance<=m_ulColorValue)
    {
    pdc->SetPixel(i/3,j,RGB(255,0,0));
    *RColor=0;
    *GColor=0;
    *BColor=0;
    }
    else
    {
    *RColor=255;
    *GColor=255;
    *BColor=255;
    }
    }

    ReleaseDC(pdc);
    ::GlobalUnlock((HGLOBAL) hDIB);
    this->SendMessage(WM_COMMAND,ID_TO8GRAYSCAL);
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
    ThresholdTrans(::FindDIBBits(lpDIB),lWidth,lHeight,100,0);
    pDoc->ClearSinglePixel();
    ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
    mb_ColorShold=false;
    return (HDIB)m_UnDo[m_UnDoCount];
    将你用不着的删掉就是了。
      

  2.   

    // 获取文档
    CCh1_1Doc* pDoc =GetDocument();
    HDIB hDIB=pDoc->GetHDIB();
    if(hDIB==NULL)return NULL;
    m_UnDo[++m_UnDoCount]=CopyHandle(hDIB);
    m_bUnDo=true;
    if(m_hHuiDuDIB==NULL)
    {
    CManage CTurnToGray((HDIB)CopyHandle(hDIB));
    m_hHuiDuDIB=CTurnToGray.TurnToGrey();
    }
    //HDIB hColorShold=(HDIB)CopyHandle(hDIB);
    // 指向DIB的指针
    LPSTR lpDIB;
    // 指向DIB象素指针
    LPSTR   lpDIBBits;
    // 锁定DIB
    //lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hColorShold);
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
    if(::DIBBits(lpDIB)!=24)
    {
    MessageBox("不是24位真彩图","警告",MB_ICONINFORMATION | MB_OK);
    return NULL;
    }
    // 更改光标形状
    BeginWaitCursor();
    // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIB);
    int i,j;
    // 图像每行的字节数
    LONG lLineBytes;
    int lWidth,lHeight;
    lWidth=::DIBWidth(lpDIB);
    lHeight=::DIBHeight(lpDIB);
    // 计算图像每行的字节数
    lLineBytes = WIDTHBYTES(lWidth * 8*3);
    CDC *pdc=GetDC();
    unsigned char  red,green,blue;
    red=GetRValue(m_ClickColor);
    green=GetGValue(m_ClickColor);
    blue=GetBValue(m_ClickColor);
    unsigned char * RColor,*GColor,*BColor;
    unsigned long ulDistance;
    for(j=lHeight-1;j>=0;j--)
    for(i=0;i<3*lWidth;i+=3)
    {

    RColor=(unsigned char*)lpDIBBits + lLineBytes *(lHeight-1-j) + i+2;
    GColor=(unsigned char*)lpDIBBits + lLineBytes * (lHeight-1-j)+ i+1;
    BColor=(unsigned char*)lpDIBBits + lLineBytes * (lHeight-1-j) + i;
    ulDistance=3*(*RColor-red)*(*RColor-red)+4*(*GColor-green)*(*GColor-green)+
    2*(*BColor-blue)*(*BColor-blue);
    if(ulDistance<=m_ulColorValue)
    {
    pdc->SetPixel(i/3,j,RGB(255,0,0));
    *RColor=0;
    *GColor=0;
    *BColor=0;
    }
    else
    {
    *RColor=255;
    *GColor=255;
    *BColor=255;
    }
    }

    ReleaseDC(pdc);
    ::GlobalUnlock((HGLOBAL) hDIB);
    this->SendMessage(WM_COMMAND,ID_TO8GRAYSCAL);
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
    ThresholdTrans(::FindDIBBits(lpDIB),lWidth,lHeight,100,0);
    pDoc->ClearSinglePixel();
    ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
    mb_ColorShold=false;
    return (HDIB)m_UnDo[m_UnDoCount];
    将你用不着的删掉就是了。