我把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;
}
}
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;
}
}
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];
将你用不着的删掉就是了。
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];
将你用不着的删掉就是了。