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

📄 thresholddlg.cpp

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

#include "stdafx.h"
#include "RSIP.h"
#include "ThresholdDlg.h"

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

#define FLAGSIZE		8

/////////////////////////////////////////////////////////////////////////////
// CThresholdDlg dialog


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


void CThresholdDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CThresholdDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CThresholdDlg, CDialog)
	//{{AFX_MSG_MAP(CThresholdDlg)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CThresholdDlg message handlers

void CThresholdDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	RECT Rect;
	SetRect(&Rect,7,22,112,63);
	MapDialogRect(&Rect);

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

	float dMaxYRatio = 0.0;
	for(int i=0;i<256;i++)
		if(m_pdwHistogram[i]>dMaxYRatio)
			dMaxYRatio = (float)m_pdwHistogram[i];

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


	dc.SetROP2(R2_NOT);

	m_nPosition = int((float)m_nThresholdLevel/256*(Rect.right-Rect.left));

	dc.MoveTo(Rect.left+m_nPosition,Rect.bottom);
	dc.LineTo(Rect.left+m_nPosition,Rect.top);

	CBitmap Bitmap;
	Bitmap.LoadBitmap(IDB_BITMAP1);

	CDC MemDC;
	MemDC.CreateCompatibleDC(&dc);
	MemDC.SelectObject(&Bitmap);
	dc.BitBlt(Rect.left+m_nPosition-FLAGSIZE/2,
			Rect.bottom+4,
			Rect.left+m_nPosition-FLAGSIZE/2+FLAGSIZE,
			Rect.bottom+4+FLAGSIZE,
			&MemDC,0,0,SRCINVERT);
	MemDC.DeleteDC();
	Bitmap.DeleteObject();
}

void CThresholdDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	RECT Rect;
	SetRect(&Rect,7,22,112,63);
	MapDialogRect(&Rect);

	if(point.x>Rect.left+m_nPosition-FLAGSIZE/2&&
		point.x<Rect.left+m_nPosition+FLAGSIZE/2&&
		point.y>Rect.bottom+4&&
		point.y<Rect.bottom+4+FLAGSIZE)
	{
		m_bSelect = TRUE;
		m_nDelta = point.x-(Rect.left+m_nPosition-FLAGSIZE/2);
		SetCapture();
	}
	
	CDialog::OnLButtonDown(nFlags, point);
}

void CThresholdDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(!m_bSelect)
		return;
	ReleaseCapture();
	m_bSelect = FALSE;
	
	CDialog::OnLButtonUp(nFlags, point);
}

void CThresholdDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	if(!m_bSelect)
		return;

	RECT Rect;
	SetRect(&Rect,7,22,112,63);
	MapDialogRect(&Rect);

	int OldPosition = m_nPosition;
	m_nPosition = point.x-m_nDelta+FLAGSIZE/2-Rect.left;
	if(m_nPosition<0)
		m_nPosition = 0;
	else if(m_nPosition>(Rect.right-Rect.left))
		m_nPosition = Rect.right-Rect.left;

	m_nThresholdLevel = int((float)m_nPosition/(Rect.right-Rect.left)*255);
	SetDlgItemInt(IDC_THRESHOLD,m_nThresholdLevel);

	CClientDC dc(this);
	
	CBitmap Bitmap;
	Bitmap.LoadBitmap(IDB_BITMAP1);

	CDC MemDC;
	MemDC.CreateCompatibleDC(&dc);
	MemDC.SelectObject(&Bitmap);
	
	dc.SetROP2(R2_NOT);

	dc.MoveTo(Rect.left+OldPosition,Rect.bottom);
	dc.LineTo(Rect.left+OldPosition,Rect.top);

	dc.BitBlt(Rect.left+OldPosition-FLAGSIZE/2,
			Rect.bottom+4,
			Rect.left+OldPosition-FLAGSIZE/2+FLAGSIZE,
			Rect.bottom+4+FLAGSIZE,
			&MemDC,0,0,SRCINVERT);

	dc.MoveTo(Rect.left+m_nPosition,Rect.bottom);
	dc.LineTo(Rect.left+m_nPosition,Rect.top);

	dc.BitBlt(Rect.left+m_nPosition-FLAGSIZE/2,
			Rect.bottom+4,
			Rect.left+m_nPosition-FLAGSIZE/2+FLAGSIZE,
			Rect.bottom+4+FLAGSIZE,
			&MemDC,0,0,SRCINVERT);

	MemDC.DeleteDC();
	Bitmap.DeleteObject();
	
	CDialog::OnMouseMove(nFlags, point);
}

BOOL CThresholdDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	SetDlgItemInt(IDC_THRESHOLD,m_nThresholdLevel);	
	
	return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CPosterizeDlg dialog


CPosterizeDlg::CPosterizeDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPosterizeDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPosterizeDlg)
	m_bEqualDistance = TRUE;
	m_nPoint = 0;
	//}}AFX_DATA_INIT
	for(int i=0; i<256; i++)
		m_lpPoint[i] = i;
	m_nPointNum = 256;
	m_nNum = 255;
	m_bSelect = FALSE;
}


void CPosterizeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPosterizeDlg)
	DDX_Control(pDX, IDC_POINTLIST, m_PointList);
	DDX_Check(pDX, IDC_EQUAL_DISTANCE, m_bEqualDistance);
	DDX_Text(pDX, IDC_POINT, m_nPoint);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPosterizeDlg, CDialog)
	//{{AFX_MSG_MAP(CPosterizeDlg)
	ON_LBN_SELCHANGE(IDC_POINTLIST, OnSelchangePointlist)
	ON_BN_CLICKED(IDC_ADDPOINT, OnAddpoint)
	ON_BN_CLICKED(IDC_DELETEPOINT, OnDeletepoint)
	ON_BN_CLICKED(IDC_EQUAL_DISTANCE, OnEqualDistance)
	ON_EN_CHANGE(IDC_NUM, OnChangeNum)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_BN_CLICKED(IDC_MODIFYPOINT, OnModifypoint)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPosterizeDlg message handlers

void CPosterizeDlg::OnSelchangePointlist()
{
	int index = m_PointList.GetCurSel();
	int OldPosition = m_nPoint;
	m_nPoint = m_lpPoint[index];
	SetDlgItemInt(IDC_POINT,m_nPoint);
	m_bSelect = FALSE;

	//OnPaint();
	RECT Rect;
	SetRect(&Rect,50,62,136,120);
	MapDialogRect(&Rect);
	InvalidateRect(&Rect,TRUE);
}

void CPosterizeDlg::OnAddpoint() 
{
	m_nPointNum = m_PointList.GetCount();
	m_lpPoint[m_nPointNum] = m_nPoint;
	m_nNum = m_nPointNum;
	m_nPointNum = m_nPointNum+1;

	//排序
	BYTE tmp;
	int nTmp = m_nPointNum-1;
	for(int i=m_nPointNum-2; i>=0; i--)
		if(m_lpPoint[i]>m_lpPoint[nTmp])
		{
			tmp = m_lpPoint[i];
			m_lpPoint[i] = m_lpPoint[nTmp];
			m_lpPoint[nTmp] = tmp;
			
			nTmp = i;
		}

	//重显
	m_PointList.ResetContent();
	for(int j=0; j<m_nPointNum; j++)
	{
		char temp[5];
		itoa(m_lpPoint[j],temp,10);
		m_PointList.AddString(temp);
	}

	SetDlgItemInt(IDC_NUM,m_nNum);
	m_PointList.SetCurSel(nTmp);
}

void CPosterizeDlg::OnDeletepoint() 
{
	// 修改内存数据
	int index = m_PointList.GetCurSel();
	for(int i=index; i<m_nPointNum-1; i++)
	{
		m_lpPoint[i] = m_lpPoint[i+1];
	}

	// 修改显示数据
	m_nPointNum = m_PointList.GetCount()-1;
	m_nNum = m_nPointNum-1;
	m_PointList.DeleteString(index);
	SetDlgItemInt(IDC_NUM,m_nNum);
}

void CPosterizeDlg::OnModifypoint() 
{
	int index = m_PointList.GetCurSel();
	m_lpPoint[index] = m_nPoint;

	m_PointList.ResetContent();
	for(int j=0; j<m_nPointNum; j++)
	{
		char temp[5];
		itoa(m_lpPoint[j],temp,10);
		m_PointList.AddString(temp);
	}
	m_PointList.SetCurSel(index);
}

void CPosterizeDlg::OnEqualDistance() 
{
	m_bEqualDistance = !m_bEqualDistance;
	if(m_bEqualDistance == TRUE)
	{
		GetDlgItem(IDC_ADDPOINT)->EnableWindow(FALSE);
		GetDlgItem(IDC_DELETEPOINT)->EnableWindow(FALSE);
		GetDlgItem(IDC_MODIFYPOINT)->EnableWindow(FALSE);
		GetDlgItem(IDC_NUM)->EnableWindow(TRUE);
	}
	else
	{
		GetDlgItem(IDC_ADDPOINT)->EnableWindow(TRUE);
		GetDlgItem(IDC_DELETEPOINT)->EnableWindow(TRUE);
		GetDlgItem(IDC_MODIFYPOINT)->EnableWindow(TRUE);
		GetDlgItem(IDC_NUM)->EnableWindow(FALSE);
		m_nNum = 1;
	}
	
	SetDlgItemInt(IDC_POINT,m_nPoint);
	SetDlgItemInt(IDC_NUM,m_nNum);

	m_nPointNum = m_nNum+1;
	for(int i=0; i<m_nPointNum; i++)
	{
		m_lpPoint[i] = BYTE(i*255.0/m_nNum);
	}
	m_PointList.ResetContent();
	for(int j=0; j<m_nPointNum; j++)
	{
		char temp[5];
		itoa(m_lpPoint[j],temp,10);
		m_PointList.AddString(temp);
	}
}

void CPosterizeDlg::OnChangeNum() 
{
	m_nNum = GetDlgItemInt(IDC_NUM);
	m_nPointNum = m_nNum+1;
	if(m_bEqualDistance == TRUE)
		for(int i=0; i<m_nPointNum; i++)
		{
			m_lpPoint[i] = BYTE(i*255.0/m_nNum);
		}
	m_PointList.ResetContent();
	for(int j=0; j<m_nPointNum; j++)
	{
		char temp[5];
		itoa(m_lpPoint[j],temp,10);
		m_PointList.AddString(temp);
	}
}

BOOL CPosterizeDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	if(m_bEqualDistance == TRUE)
	{
		GetDlgItem(IDC_ADDPOINT)->EnableWindow(FALSE);
		GetDlgItem(IDC_DELETEPOINT)->EnableWindow(FALSE);
		GetDlgItem(IDC_MODIFYPOINT)->EnableWindow(FALSE);
		GetDlgItem(IDC_NUM)->EnableWindow(TRUE);
	}
	else
	{
		GetDlgItem(IDC_ADDPOINT)->EnableWindow(TRUE);
		GetDlgItem(IDC_DELETEPOINT)->EnableWindow(TRUE);
		GetDlgItem(IDC_MODIFYPOINT)->EnableWindow(TRUE);
		GetDlgItem(IDC_NUM)->EnableWindow(FALSE);
	}
	
	SetDlgItemInt(IDC_POINT,m_nPoint);
	SetDlgItemInt(IDC_NUM,m_nNum);

	m_PointList.ResetContent();
	for(int i=0; i<m_nPointNum; i++)
	{
		char temp[5];
		itoa(m_lpPoint[i],temp,10);
		m_PointList.AddString(temp);
	}
	
	return TRUE;
}

void CPosterizeDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
		
	RECT Rect;
	SetRect(&Rect,52,62,133,112);
	MapDialogRect(&Rect);

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

	float dMaxYRatio = 0.0;
	for(int i=0; i<256; i++)
		if(m_pdwHistogram[i]>dMaxYRatio)
			dMaxYRatio = (float)m_pdwHistogram[i];

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

	dc.SetROP2(R2_NOT);

	m_nPosition = int((float)m_nPoint/256*(Rect.right-Rect.left));

	dc.MoveTo(Rect.left+m_nPosition,Rect.bottom);
	dc.LineTo(Rect.left+m_nPosition,Rect.top);

	CBitmap Bitmap;
	Bitmap.LoadBitmap(IDB_BITMAP1);

	CDC MemDC;
	MemDC.CreateCompatibleDC(&dc);
	MemDC.SelectObject(&Bitmap);
	dc.BitBlt(Rect.left+m_nPosition-FLAGSIZE/2,
			Rect.bottom+4,
			Rect.left+m_nPosition-FLAGSIZE/2+FLAGSIZE,
			Rect.bottom+4+FLAGSIZE,
			&MemDC,0,0,SRCINVERT);
	MemDC.DeleteDC();
	Bitmap.DeleteObject();
}

void CPosterizeDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	RECT Rect;
	SetRect(&Rect,52,62,133,112);
	MapDialogRect(&Rect);

	if(point.x>Rect.left+m_nPosition-FLAGSIZE/2 &&
		point.x<Rect.left+m_nPosition+FLAGSIZE/2 &&
		point.y>Rect.bottom+4 &&
		point.y<Rect.bottom+4+FLAGSIZE)
	{
		m_bSelect = TRUE;
		m_nDelta = point.x-(Rect.left+m_nPosition-FLAGSIZE/2);
		SetCapture();
	}
	
	CDialog::OnLButtonDown(nFlags, point);
}

void CPosterizeDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(!m_bSelect)
		return;
	ReleaseCapture();
	m_bSelect = FALSE;
	
	CDialog::OnLButtonUp(nFlags, point);
}

void CPosterizeDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	if(!m_bSelect)
		return;

	RECT Rect;
	SetRect(&Rect,52,62,133,112);
	MapDialogRect(&Rect);

	int OldPosition = m_nPosition;
	m_nPosition = point.x-m_nDelta+FLAGSIZE/2-Rect.left;
	if(m_nPosition<0)
		m_nPosition = 0;
	else if(m_nPosition>(Rect.right-Rect.left))
		m_nPosition = Rect.right-Rect.left;

	m_nPoint = int((float)m_nPosition/(Rect.right-Rect.left)*255);
	SetDlgItemInt(IDC_POINT,m_nPoint);

	CClientDC dc(this);
	
	CBitmap Bitmap;
	Bitmap.LoadBitmap(IDB_BITMAP1);

	CDC MemDC;
	MemDC.CreateCompatibleDC(&dc);
	MemDC.SelectObject(&Bitmap);
	
	dc.SetROP2(R2_NOT);

	dc.MoveTo(Rect.left+OldPosition,Rect.bottom);
	dc.LineTo(Rect.left+OldPosition,Rect.top);

	dc.BitBlt(Rect.left+OldPosition-FLAGSIZE/2,
			Rect.bottom+4,
			Rect.left+OldPosition-FLAGSIZE/2+FLAGSIZE,
			Rect.bottom+4+FLAGSIZE,
			&MemDC,0,0,SRCINVERT);

	dc.MoveTo(Rect.left+m_nPosition,Rect.bottom);
	dc.LineTo(Rect.left+m_nPosition,Rect.top);

	dc.BitBlt(Rect.left+m_nPosition-FLAGSIZE/2,
			Rect.bottom+4,
			Rect.left+m_nPosition-FLAGSIZE/2+FLAGSIZE,
			Rect.bottom+4+FLAGSIZE,
			&MemDC,0,0,SRCINVERT);

	MemDC.DeleteDC();
	Bitmap.DeleteObject();
	
	CDialog::OnMouseMove(nFlags, point);
}

void CPosterizeDlg::OnOK() 
{
	if(m_nNum != m_nPointNum-1)
	{
		AfxMessageBox("分割点数目和分割等级不符!\n\n请重新设置分割点!");
		return;
	}
	CDialog::OnOK();
}

⌨️ 快捷键说明

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