⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 histogramdlg.cpp

📁 基于小波的SAR斑点处理
💻 CPP
字号:
// HistogramDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RSIP.h"
#include "HistogramDlg.h"

#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// HistogramDlg dialog


HistogramDlg::HistogramDlg(CWnd* pParent /*=NULL*/)
	: CDialog(HistogramDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(HistogramDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_bTrace = FALSE;
}


void HistogramDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(HistogramDlg)
	DDX_Control(pDX, IDC_CHUNNEL_COMBO, m_ChunnelList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(HistogramDlg, CDialog)
	//{{AFX_MSG_MAP(HistogramDlg)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_PAINT()
	ON_CBN_SELCHANGE(IDC_CHUNNEL_COMBO, OnSelchangeChunnelCombo)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// HistogramDlg message handlers

void HistogramDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	RECT Rect;

	SetRect(&Rect,7,26,174,98);
	MapDialogRect(&Rect);

	if(point.x<Rect.left || point.x>Rect.right ||
		point.y<Rect.top || point.y>Rect.bottom)
		return;
	
	m_bTrace = TRUE;
	SetCapture();
	m_nBeginValue = point.x;
	m_nJustValue = point.x;
	
	CDialog::OnLButtonDown(nFlags, point);
}

void HistogramDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(!m_bTrace)
		return;
	
	ReleaseCapture();
	m_bTrace = FALSE;

	RECT Rect;

	SetRect(&Rect,7,26,174,98);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect);

	CDialog::OnLButtonUp(nFlags, point);
}

void HistogramDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	RECT Rect;

	SetRect(&Rect,7,26,174,98);
	MapDialogRect(&Rect);

	if(point.x<Rect.left || point.x>Rect.right ||
		point.y<Rect.top || point.y>Rect.bottom)
		return;

	double dXRatio = 255.0/(Rect.right-Rect.left);

	int nChannel;
	if(m_nImageType == IMAGE_SINGLEBAND)
		nChannel = 0;
	else
		nChannel = m_ChunnelList.GetCurSel();

	if(m_bTrace)
	{
		CClientDC dc(this);
		dc.SetROP2(R2_NOT);
		int i;
		if(m_nJustValue<point.x)
		{
			for(int i=m_nJustValue; i<point.x; i++)
			{
				dc.MoveTo(i,Rect.top);
				dc.LineTo(i,Rect.bottom);
			}
		}
		else
		{
			for(int i=point.x; i<m_nJustValue; i++)
			{
				dc.MoveTo(i,Rect.top);
				dc.LineTo(i,Rect.bottom);
			}
		}

		char szText[16];
		DWORD dwCount = 0;

		int nLevel1 = int((m_nBeginValue-Rect.left)*dXRatio+0.5);
		int nLevel2 = int((point.x-Rect.left)*dXRatio+0.5);
		if(nLevel1<nLevel2)
		{
			sprintf(szText,"%d..%d",nLevel1,nLevel2);
			for(i=nLevel1; i<nLevel2; i++)
				dwCount += m_pdwHistogram[nChannel*256+i];
		}
		else
		{
			sprintf(szText,"%d..%d",nLevel2,nLevel1);
			for(i=nLevel2; i<nLevel1; i++)
				dwCount += m_pdwHistogram[nChannel*256+i];
		}
		SetDlgItemText(1024,szText);
		SetDlgItemInt(1025,dwCount);
		
		sprintf(szText,"%.6f",(double)dwCount/m_dwPixels*100.0);
		SetDlgItemText(1026,szText);

		m_nJustValue = point.x;
	}
	else
	{
		int nLevel = int((point.x-Rect.left)*dXRatio+0.5);
		SetDlgItemInt(1024,nLevel);
		
		SetDlgItemInt(1025,m_pdwHistogram[nChannel*256+nLevel]);

		char szText[16];
		sprintf(szText,"%.6f",(double)m_pdwHistogram[nChannel*256+nLevel]/m_dwPixels*100.0);
		SetDlgItemText(1026,szText);
	}
	CDialog::OnMouseMove(nFlags, point);
}

void HistogramDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	RECT Rect;
	
	SetRect(&Rect,7,26,174,98);
	MapDialogRect(&Rect);
	
	double dMaxRatio = 0;
	double dXRatio = (double)(Rect.right-Rect.left)/255;
	int nChannel;
	if(m_nImageType == IMAGE_SINGLEBAND)
		nChannel = 0;
	else
		nChannel = m_ChunnelList.GetCurSel();

	for(int i=0; i<256; i++)
	{
		if(dMaxRatio<m_pdwHistogram[nChannel*256+i])
			dMaxRatio = m_pdwHistogram[nChannel*256+i];
	}
	dMaxRatio = (Rect.bottom-Rect.top)/dMaxRatio;
	
	for(i=0; i<256; i++)
	{
		dc.MoveTo(int(i*dXRatio+Rect.left),int(Rect.bottom-dMaxRatio*m_pdwHistogram[nChannel*256+i]));
		dc.LineTo(int(i*dXRatio+Rect.left),Rect.bottom);
	}

	SetRect(&Rect,7,97,174,110);
	MapDialogRect(&Rect);

	if(m_nImageType==IMAGE_SINGLEBAND)
	{
		CPen Pen;
		CPen *pOldPen;
		for(i=0;i<256;i++)
		{
			Pen.CreatePen(PS_SOLID,1,RGB(i,i,i));
			pOldPen = dc.SelectObject(&Pen);
			dc.MoveTo(int(i*dXRatio+Rect.left),Rect.bottom);
			dc.LineTo(int(i*dXRatio+Rect.left),Rect.top);
			dc.SelectObject(pOldPen);
			Pen.DeleteObject();
		}
	}
	else
	{
		CPen Pen;
		CPen *pOldPen;
		for(i=0; i<256; i++)
		{
			if(nChannel==0)
				Pen.CreatePen(PS_SOLID,1,RGB(i,0,0));
			else if(nChannel==1)
				Pen.CreatePen(PS_SOLID,1,RGB(0,i,0));
			else
				Pen.CreatePen(PS_SOLID,1,RGB(0,0,i));

			pOldPen = dc.SelectObject(&Pen);
			dc.MoveTo(int(i*dXRatio+Rect.left),Rect.bottom);
			dc.LineTo(int(i*dXRatio+Rect.left),Rect.top);
			dc.SelectObject(pOldPen);
			Pen.DeleteObject();
		}
	}
}

void HistogramDlg::OnSelchangeChunnelCombo() 
{
	RECT Rect;
	SetRect(&Rect,7,26,174,111);
	MapDialogRect(&Rect);

	InvalidateRect(&Rect);

	int nChannel = m_ChunnelList.GetCurSel();
	
	char szText[16];
	double dCount = 0;
	for(int i=0;i<256;i++)
	{
		dCount += i*m_pdwHistogram[nChannel*256+i];
	}
	double dMean = (double)dCount/m_dwPixels;
	sprintf(szText,"%.6f",dMean);
	SetDlgItemText(1020,szText);

	dCount=0;
	for(i=0;i<256;i++)
	{
		dCount = dCount+(i-dMean)*(i-dMean)*m_pdwHistogram[nChannel*256+i];
	}
	sprintf(szText,"%.6f",sqrt(dCount/m_dwPixels));
	SetDlgItemText(1021,szText);

	dCount=0;
	for(i=0; i<256; i++)
	{
		dCount += m_pdwHistogram[nChannel*256+i];
		if(dCount>=m_dwPixels/2)
			break;
	}
	SetDlgItemInt(1022,i);	
}

BOOL HistogramDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	if(m_nImageType == IMAGE_COMBINE)
	{
		m_ChunnelList.AddString("红");
		m_ChunnelList.AddString("绿");
		m_ChunnelList.AddString("蓝");
		m_ChunnelList.SetCurSel(0);
	}
	else
		m_ChunnelList.EnableWindow(FALSE);

	SetDlgItemInt(1023,m_dwPixels);

	char szText[16];
	double dCount = 0;
	for(int i=0; i<256; i++)
	{
		dCount += i*m_pdwHistogram[i];
	}
	double dMean = (double)dCount/m_dwPixels;
	sprintf(szText,"%.6f",dMean);
	SetDlgItemText(1020,szText);

	dCount=0;
	for(i=0; i<256; i++)
	{
		dCount = dCount+(i-dMean)*(i-dMean)*m_pdwHistogram[i];
	}
	sprintf(szText,"%.6f",sqrt(dCount/m_dwPixels));
	SetDlgItemText(1021,szText);

	dCount=0;
	for(i=0; i<256; i++)
	{
		dCount += m_pdwHistogram[i];
		if(dCount >= m_dwPixels/2)
			break;
	}
	SetDlgItemInt(1022,i);

	return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -