您的位置:逆风者 VC++ 正文
 添加时间:2008-03-21 原文发表:2008-03-21 人气:122 来源:vckbase.com

本文章共1809字,分2页,当前第1页,快速翻页:
 
作者:爱撒娇的小妮子(华丽杀猫帮)

下载源代码

引言
逆风者
感谢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<nHeight;y++)
	{
		for(int x = 0;x<nWidth;x++)
		{
			COLORREF pixel=m_imageFile.GetPixel(x,y);
			byte r,g,b;
			r = GetRValue(pixel);
			g = GetGValue(pixel);
			b = GetBValue(pixel);
			pUnchImage[y*nWidth+x] = 255<<24 | r<<16| g<<8|b;
		}
	}

	// canny算子计算后的结果
	unsigned char * pUnchEdge = new unsigned char[nWidth*nHeight];

	// 调用canny函数进行边界提取
	Canny(pUnchImage, nWidth, nHeight, 0.4, 0.4, 0.79, pUnchEdge) ;

	//将运算完的图像转化为矩阵
	for(int y=0; y<nHeight; y++)
	{
		for(int x=0; x<nWidth; x++)
		{
			byte r,g,b,Result;
			r = (0x000000ff&pUnchEdge[y*nWidth+x]>>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算子的效果

底片化处理:
void CFigureView::OpposeImage(CImage& pImage)
{
	CWaitCursor WaitCursor;
	int height = m_imageFile.GetHeight();
	int width = m_imageFile.GetWidth();
	for(int x=0;x<width;x++)
	{
		for(int y=0;y<height;y++)
		{
			COLORREF pixel=m_imageFile.GetPixel(x,y);
			byte r,g,b;
			r=GetRValue(pixel);
			g=GetGValue(pixel);
			b=GetBValue(pixel);
			m_imageFile.SetPixelRGB(x,y,255-r,255-g,255-b);
		}
	}
}
底片化处理效果:


暗化处理
void CFigureView::DarkImage(CImage& pImage)
{
	CWaitCursor WaitCursor;
	int width = pImage.GetWidth();
	int height = pImage.GetHeight();
	for(int x=0;x<width;x++)
	{
		for(int y=0;y<height;y++)
		{
			COLORREF pixel=pImage.GetPixel(x,y);
			byte r,g,b;
			r=GetRValue(pixel);
			g=GetGValue(pixel);
			b=GetBValue(pixel);
			pImage.SetPixelRGB(x,y,r*0.8,g*0.8,b*0.8);
		}
	}
}
 
 
本文章更多内容1 - 2 - 下一页>>
相关文章

MFC 通用控件的初始化
浅谈输入法编程
多线程管理类
如何实现由列表控件控制的属性表
动态创建控件支持事件响应并可保存与读取
简单录、放音并保存为wav文件程序
I2C通信
文件过滤系统驱动开发Filemon学习笔记
DynamicLayout-VC 6.0对话框动态布局解决方
用命令模式实现对象存储——对象与关系数据
运动搜索算法之钻石搜索(Ver1.0)
VC6下的GDI+双缓冲
使用SNMP编辑(添加/删除/修改)ARP表
VC6绘制3D饼状图
强制编译时约束
在C++中实现C#的delegate机制
一个工业控制管道流动控件的实现
Thunk 技术的一个改进
直接调用类成员函数地址
自定义控件—特效列表控件

相关评论


本文章所属分类:首页 VC++

  热门关键字: