Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1569754
  • 博文数量: 884
  • 博客积分: 52280
  • 博客等级: 大将
  • 技术积分: 13060
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-06 09:46
文章分类

全部博文(884)

文章存档

2008年(884)

我的朋友

分类: C/C++

2008-08-06 10:04:46

下载本文示例代码
下载源代码

引言
感谢VCKBASE以及其中无数的大大们提供了如此多的实实在在的开源代码,使我一个在学校的学生能够接触到一些实实在在的东西.想来自己潜水也有一载了.如今眼瞅毕业了即将成为无业游民,投篇拙文留个纪念.顺便感叹一下前途的迷茫.
言归正传,写这个程序主要是由于毕业设计,放在学校档案室如土不如拿上来给大家分享.其实主要功能是对图象利用canny算子进行边缘检测.以及其他一些比较基本的滤镜功能.
主要应用了GDI 所以图象格式处理与显示都比较容易.主要思想是转化为一个bmp位图矩阵,然后对这个矩阵用一些算子进行操作,这些算子大多都能在网上找到现成的资料,所以不在这里赘言了.
顺便提一下canny算子只有c函数的.理论依据对数学要求颇高,我也没深入研究下去所以边缘查找的效果有时候并不是非常的好,容易检测出一些多余的东西.

编程实现:

原图


Canny算子找边缘的实现,canny算子的代码请看源文件 或者网上搜 canny算子进行提取边缘之前先要对图象进行黑白处理。

void CFigureView::OnPsCanny()

{

	// TODO: 在此添加命令处理程序代码

	CWaitCursor WaitCursor;



	int nWidth = m_imageFile.GetWidth();

	int nHeight= m_imageFile.GetHeight();



	// 开辟内存,存储图象数据

	unsigned char * pUnchImage = new unsigned char[nWidth*nHeight];

	// 将图像数据保存在矩阵当中

	for(int y = 0;y>16)?0:255;

			g = (0x000000ff&pUnchEdge[y*nWidth x]>>8)?0:255;

			b = (0x000000ff&pUnchEdge[y*nWidth x])?0:255;

			Result = ((r g b)/3);

			m_imageFile.SetPixelRGB(x,y,Result,Result,Result);

		}

	}



	MakeBlackWhiteImage(m_imageFile,0);



	delete []pUnchImage;

	pUnchImage = NULL  ;

	delete []pUnchEdge ;

	pUnchEdge = NULL   ;



	CFigureDoc* pDoc = GetDocument();

	ASSERT_VALID(pDoc);

	if (!pDoc)

		return;

	pDoc->SetModifiedFlag(TRUE);

	Invalidate();

}

Canny算子效果:
下载本文示例代码
黑白处理的 canny算子的效果
阅读(265) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~