【图像算法】彩色图像分割专题二:显示屏幕上任意点颜色值
【图像算法】彩色图像分割专题一:显示屏幕上任意点的颜色值
SkySeraph May 13rd 2011 HQU
Email:zgzhaobo@gmail.com QQ:452728574
Latest Modified Date:May 13rd 2011 HQU
》说明:
1 分析彩色图像时,不同空间的选择,需要实时知道图像上某点的颜色值,参考网上相关资料,实现实时显示屏幕上任意点的RGB/HSV/YIQ值,当然还可以是其它色彩空间的值,原理类似没在重复。
2 关于颜色空间相关知识,请参考:
http://www.cnblogs.com/skyseraph/archive/2011/05/03/2035643.html
http://www.cnblogs.com/skyseraph/archive/2011/05/05/2038317.html
http://www.cnblogs.com/skyseraph/archive/2011/05/05/2038308.html
3 类似软件
http://www.broadhurst-family.co.uk/lefteye/MainPages/Lab.htm RGB/Lab/HSV软件
》实现(源码):
响应函数
//////////////////////////////////////////////////////////////////////////
void CColorSegDlg::OnFetchColor()
// 获取屏幕上任意点的RGB值并显示
{
m_bSnapFlag^=TRUE;
if (m_bSnapFlag) //开启屏幕取色
{
m_ColorPicker.SetWindowText("Stop Fetch");
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetTimer(1, 80, NULL); //80ms触发一次定时器
}
else
{
m_ColorPicker.SetWindowText("Start Fetch");
SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
KillTimer(1);
}
//注:另一种方法:不采用bool标记m_bSnapFlag,
//采用if(m_ColorPicker.GetCheck()) 但这种方法不能实现菜单的控制
}
Time函数
void CColorSegDlg::OnTimer(UINT nIDEvent)
{
if (nIDEvent != 1)
return;
CPoint pt;
GetCursorPos(&pt);
HDC hDC = ::GetDC(NULL);
COLORREF clr = ::GetPixel(hDC, pt.x, pt.y);
int R=GetRValue(clr);
int G=GetGValue(clr);
int B=GetBValue(clr);
// 输出RGB值
CString ClrText;
ClrText.Format("%d",R);//GetRValue(clr)
m_EditRed.SetWindowText(ClrText);
ClrText.Format("%d",G);//GetGValue(clr)
m_EditGreen.SetWindowText(ClrText);
ClrText.Format("%d",B);//GetBValue(clr)
m_EditBlue.SetWindowText(ClrText);
CString cs;
// HSV
double hsvH,hsvS,hsvV;
pMyColorSpace.MyRGB2HSV(R,G,B,hsvH,hsvS,hsvV,1);
// 输出HSV值
cs.Format("%.3f",hsvH);
GetDlgItem(IDC_H)->SetWindowText(cs);
cs.Format("%.3f",hsvS);
GetDlgItem(IDC_S)->SetWindowText(cs);
cs.Format("%.3f",hsvV);
GetDlgItem(IDC_V)->SetWindowText(cs);
// YUV && YIQ
double yuvY,yuvU,yuvV,yiqY,yiqI,yiqQ;
pMyColorSpace.MyRGB2YUV(R,G,B,yuvY,yuvU,yuvV);
pMyColorSpace.MyRGB2YIQ(R,G,B,yiqY,yiqI,yiqQ);
//int nTH=int(atan(fabs(yuvV/yuvU))*180.0/3.1415926);
// 输出YIQ值
cs.Format("%.3f",yiqQ);
GetDlgItem(IDC_yiqQ)->SetWindowText(cs);
cs.Format("%.3f",yiqI);
GetDlgItem(IDC_yiqI)->SetWindowText(cs);
cs.Format("%.3f",yiqY);
GetDlgItem(IDC_yiqY)->SetWindowText(cs);
// 显示区域
CRect m_rect;
m_Color.GetClientRect(m_rect);
CDC* dc = m_Color.GetDC();
CBrush m_brush(RGB(GetRValue(clr),GetGValue(clr),GetBValue(clr)));
dc->FillRect(m_rect,&m_brush);
::ReleaseDC(NULL, hDC);
CDialog::OnTimer(nIDEvent);
}
》效果

完整界面见:
http://www.cnblogs.com/skyseraph/archive/2011/05/05/2038308.html
Author: SKySeraph
Email/GTalk: zgzhaobo@gmail.com QQ:452728574
From: http://www.cnblogs.com/skyseraph/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果
作者:skyseraph
出处:http://www.cnblogs.com/skyseraph/
更多精彩请直接访问SkySeraph个人站点:http://skyseraph.com//
Email/GTalk: zgzhaobo@gmail.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。



浙公网安备 33010602011771号