• 【图像算法】彩色图像分割专题二:显示屏幕上任意点颜色值


    【图像算法】彩色图像分割专题一:显示屏幕上任意点的颜色值

    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/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果

     

  • 相关阅读:
    json schema相关
    好看的记录片和电影
    java函数局部变量的坑(非常隐藏)
    maven操作
    Js数组的常用的方法概述
    深入理解JS各种this指向问题
    浅谈ES5和ES6继承和区别
    vue
    使用 vue-i18n 切换中英文
    js_数组对象的浅克隆
  • 原文地址:https://www.cnblogs.com/skyseraph/p/2045826.html
Copyright © 2020-2023  润新知