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);
		}
	}
}

测试时用的是灰度图像,实现效果如下:

时间: 2024-08-29 08:15:54

CImage对象使用罗伯特算子进行边缘检测的相关文章

基于VC.NET的GDI+编程之CImage

我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标.位图.光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP.GIF.JPEG等).因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码.现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了. CImage类概述 CImage是MFC和ATL共享的新

MFC对话框应用程序显示图像

1 首先创建一个基于对话框的MFC应用程序MFCDlgTest 2 打开资源视图,插入新的对话框,修改ID为IDD_SHOWIMGDLG,右击对话框,添加类CShowImgDlg.在ShowImgDlg.h头文件中包含<atlimage.h>头文件,并建立CImage对象 #include <atlimage.h> private: CImage image; 3 删除对话框中的无关控件,添加一个新按钮"打开图像",修改其ID为IDC_OPEN,并添加事件处理程

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

        最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法.       ~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾

警惕python的*重复符

在python中有个特殊的符号"*",可以用做数值运算的乘法算子,也是用作对象的重复算子,但在作为重复算子使用时一定要注意 注意的是:*重复出来的各对象具有同一个id,也就是指向在内存中同一块地址,在对各个对象进行操作是一定要注意. 举例来说: >>> alist = [range(3)]*4 >>> alist [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]] 上面初始化一个二层列表用来模拟矩阵,该矩阵式4X

MFC单文档应用程序显示图像

1 利用VS2010向导创建一个MFC单文档应用程序MFCTest 2 在MFCTestView.h中引用<atlimage.h>,并创建一个CImage对象 #include <atlimage.h> private: CImage image; 3 打开资源文件,选中Menu下面的IDR_MAINFRAME,添加一个新的菜单项"打开图像",修改其ID为IDM_OPEN,再点击鼠标右键,添加事件处理程序,在弹出的对话框的列表中选择CMFCTestView 4

C++ 仿函数/函数指针/闭包lambda

在上一篇文章中介绍了C++11新引入的lambda表达式(C++支持闭包的实现),现在我们看一下lambda的出现对于我们编程习惯的影响,毕竟,C++11历经10年磨砺,出140新feature,对于我们的programming idiom有深远影响.我们先看一下是不是lambda的出现对于仿函数的影响. 1) 仿函数 wikipedia 的定义: A function object, also called a functor, functional, or functionoid, is a

《Spark官方文档》Spark Streaming编程指南(一)

Spark Streaming编程指南 概览   Spark Streaming是对核心Spark API的一个扩展,它能够实现对实时数据流的流式处理,并具有很好的可扩展性.高吞吐量和容错性.Spark Streaming支持从多种数据源提取数据,如:Kafka.Flume.Twitter.ZeroMQ.Kinesis以及TCP套接字,并且可以提供一些高级API来表达复杂的处理算法,如:map.reduce.join和window等.最后,Spark Streaming支持将处理完的数据推送到文

MFC学习笔记之三(粒子系统+怪物简单AI+碰撞检测)

到上海找到住的地方之后,干的第一件事,就是抓紧时间学习,为了找到工作努力ing... 备注:以下请参考http://blog.csdn.net/hust_xy/article/details/9374935来看,本文是对其详细说明.解释和加深. 为了防止看不懂,补充一个到目前为止(下面的九截止,即本篇结束)的Hero类声明和类方法定义 <span style="font-size:14px;">class Hero { int x; //人物的x坐标(指左上部分) int

十大著名黑客:乔布斯和沃兹尼亚克上榜

凤凰科技讯 北京时间5月28日消息,一提到黑客,人们便会想到一个坐在5台电脑前,双手飞速的敲击键盘,目不转睛的盯着屏幕上天书式的代码. 然后重重的点一下回车,"当"一声,便成功入侵美国中情局系统或者从银行盗走数百万美元.但黑客并非总是破坏或者盗取信息的为恶者,其中最出名的黑客 的确因其非法行径而受到惩处,但他们中的许多人都已"改邪归正"-- 有的成立了自己的公司.成为亿万富翁,有的则著书立传.成为了畅销书经销商.罗伯特森列举了其中的十大著名黑客,其中苹果公司联合创始