CImage对象使用罗伯特算子进行边缘检测

简介:

1 在新插入的对话框中添加两个Picture Control和两个Button

2 打开图像代码和显示图像代码和前面两篇博文类似

BEGIN_MESSAGE_MAP(CEdgeDetDlg, CDialogEx)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_OPEN_BTN, &CEdgeDetDlg::OnClickedOpenBtn)
	ON_BN_CLICKED(IDC_EDGE_DETECTION_BTN, &CEdgeDetDlg::OnClickedEdgeDetectionBtn)
END_MESSAGE_MAP()


// CEdgeDetDlg 消息处理程序

void CEdgeDetDlg::OnClickedOpenBtn()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog dlg(TRUE,_T(".bmp"),_T("*.jpg"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		_T("Bit Map(*.bmp)|*.bmp|JPEG Map(*.jpg)|*.jpg||"));
	if(dlg.DoModal() == IDOK)
	{
		if(!yuantu.IsNull())
		{
			yuantu.Destroy();
		}
		yuantu.Load(dlg.GetPathName());
		Invalidate(FALSE);
	}
}

//边缘检测
void CEdgeDetDlg::OnClickedEdgeDetectionBtn()
{
	if (yuantu.IsNull())
	{
		MessageBox(_T("还未打开图像"),_T("系统提示"),MB_OK);
		return;
	}
	if(!bianyuantu.IsNull())
	{
		bianyuantu.Destroy();
	}

	int i,j,temp;
	int pixel[4];
	int width = yuantu.GetWidth();
	int height = yuantu.GetHeight();
	int widthBytes = yuantu.GetPitch();
	bianyuantu.Create(width,height,yuantu.GetBPP());

	if(yuantu.IsIndexed())
	{
		yuantu.GetColorTable(0,256,colorTable);
		bianyuantu.SetColorTable(0,256,colorTable);
	}
	BYTE *pYuantuData = (BYTE*)yuantu.GetBits();
	BYTE *pBianyuantuData =(BYTE*)bianyuantu.GetBits();

	
	for(j=0;j<height-1;j++)
	{
		for(i=0;i<width-1;i++)
		{
			pixel[0]=pYuantuData[j*widthBytes+i];
			pixel[1]=pYuantuData[j*widthBytes+i+1];
			pixel[2]=pYuantuData[(j+1)*widthBytes+i];
			pixel[3]=pYuantuData[(j+1)*widthBytes+i+1];
			temp=(int)sqrt((double)((pixel[0]-pixel[3])*(pixel[0]-pixel[3])
				+(pixel[1]-pixel[2])*(pixel[1]-pixel[2])));
			pBianyuantuData[j*widthBytes+i]=temp;
		}
	}

	Invalidate(FALSE);
}

void CEdgeDetDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();

		if(!yuantu.IsNull())
		{
			CWnd* pWndYuantu = this->GetDlgItem(IDC_YUANTU);
			CDC* pdc = pWndYuantu->GetDC();
			yuantu.Draw(pdc->GetSafeHdc(), 0, 0);
			pWndYuantu->ReleaseDC(pdc);
		}

		if(!bianyuantu.IsNull())
		{
			CWnd* pWndBianyuantu = this->GetDlgItem(IDC_BIANYUANTU);
			CDC* pdc = pWndBianyuantu->GetDC();
			bianyuantu.Draw(pdc->GetSafeHdc(), 0, 0);
			pWndBianyuantu->ReleaseDC(pdc);
		}
	}
}
测试时用的是灰度图像,实现效果如下:


转载:http://blog.csdn.net/foreverling/article/details/40116763

目录
相关文章
|
2月前
基于形状模板匹配(一)相关算子简介
基于形状模板匹配(一)相关算子简介
|
2月前
halcon算子模板匹配(一)基于形状的模板匹配
halcon算子模板匹配(一)基于形状的模板匹配
128 0
|
算法 数据可视化
Halcon边缘检测和线条检测(1),文章含自适应/动态二值化等算子
Halcon边缘检测和线条检测(1),文章含自适应/动态二值化等算子
1194 0
|
存储 算法
halcon模板匹配实践(1)算子参数说明与算子简介
halcon模板匹配实践(1)算子参数说明与算子简介
687 0
|
2月前
|
算法 计算机视觉 C++
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
|
2月前
Halcon基础系列之矩阵相关算子
Halcon基础系列之矩阵相关算子
|
2月前
halcon基础系列之基于相关性模板匹配算子
halcon基础系列之基于相关性模板匹配算子
|
2月前
halcon基础系列之二维量测相关算子
halcon基础系列之二维量测相关算子
|
2月前
|
算法
halcon系列之直线拟合和圆形拟合算子
halcon系列之直线拟合和圆形拟合算子
|
5月前
|
算法 计算机视觉 芯片
[Halcon&定位] 二维仿射变换原理与算子解析
[Halcon&定位] 二维仿射变换原理与算子解析
133 0