我用彩色线阵ccd获取的RGB值,因为数值不均匀,很难找到颜色块之间的差别,所以想把彩色图像转换为黑白,然后通过灰度值分割,把每个颜色分离出来,请问怎么做?还有图像RGB值不均匀,怎么变成均匀的?谢谢
解决方案 »
- 对话框如何切换输入法?
- 同一个函数中如何顺序执行两个线程
- 对话框 中 edit 控件 产生的可以处理的消息有哪些?
- cdma 接收短信 大于140bytes如何办? 什么时候可以在发送第一条短信后发送第二条? 群发是不是逐个发送?
- 请帮我看看以下两种读文本文件的方法问题在哪里。谢谢!
- 如何对齐窗口里面的控件?
- 请各位大侠教教我这个菜鸟!!
- 我没有做过VC,大家都来说说你们用VC做了些什么,最好给出具体例子,还有做出来东西有没有市场等等,先送100分。
- ODBC,ADO,OLE DB之间的关系是什么?
- VC中为什么会丢失颜色?
- 如何获得Listctrl Item的HDC
- 如何获取listctrl双击时,鼠标相对于listctrl的位置?
{
// TODO: Add your command handler code here
HANDLE data1handle;
LPBITMAPINFOHEADER lpBi;
BITMAPINFO *m_pBMI;
CDibDoc *pDoc=GetDocument();
HDIB hdib;
unsigned char *hData;
unsigned char *data;
hdib=pDoc->GetHDIB();//得到位图数据的句柄,其中包含图像信息头
BeginWaitCursor();
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
m_pBMI=new BITMAPINFO;//生成彩色图像的信息头
m_pBMI->bmiHeader.biBitCount=24;
m_pBMI->bmiHeader.biClrImportant=0;
m_pBMI->bmiHeader.biClrUsed=0;
m_pBMI->bmiHeader.biCompression=BI_RGB;
m_pBMI->bmiHeader.biHeight=lpBi->biHeight;
m_pBMI->bmiHeader.biWidth=lpBi->biWidth;
m_pBMI->bmiHeader.biPlanes=1;
m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
m_pBMI->bmiHeader.biXPelsPerMeter=0;
m_pBMI->bmiHeader.biYPelsPerMeter=0;
m_pBMI->bmiHeader.biSizeImage=WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3;
file://data=hData;
int R,G,B,i,j;
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3);
file://生成存储彩色图象数据的缓冲区
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
for(i=0;ibiHeight;i++)//实现灰度到彩色变换
for(j=0;jbiWidth*8);j++)
{
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=64)
{R=0;
G=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
B=255;
}
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>64
&& *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=128)
{R=0;
G=255;
B=(int)4*(128-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
}
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>128
&& *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=192)
{R=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)-128);
G=255;
B=0;
}
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>192
&& *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=255)
{R=255;
G=(int)4*(255-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
B=0;
}
file://将生成的R、G、B分量存入目标缓冲区
*(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3)=B;
*(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+1)=G;
*(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+2)=R;
}
GlobalUnlock((HGLOBAL)hdib);
GlobalUnlock(data1handle);
EndWaitCursor();
CClientDC pDC(this);
file://显示真彩色图像
StretchDIBits(pDC.GetSafeHdc(),0,0,lpBi->biWidth,lpBi->biHeight,0,0,
lpBi->biWidth, lpBi->biHeight,data,m_pBMI,DIB_RGB_COLORS,
SRCCOPY);
delete m_pBMI;
}
http://topic.csdn.net/u/20090826/21/b57b0630-48bf-4e19-b14b-b2fd9634eb44.html
for(j=0;j<width;j++)
{
gray_dst[3*(i*width+j)+0]=0.299*rgb_src[i*width+j].Red+
0.587*rgb_src[i*width+j].Green+
0.114*rgb_src[i*width+j].Blue;
gray_dst[3*(i*width+j)+1]=0.299*rgb_src[i*width+j].Red+
0.587*rgb_src[i*width+j].Green+
0.114*rgb_src[i*width+j].Blue;
gray_dst[3*(i*width+j)+2]=0.299*rgb_src[i*width+j].Red+
0.587*rgb_src[i*width+j].Green+
0.114*rgb_src[i*width+j].Blue;
}
转换公式为:B*0.114+G*0.587+R*0.299