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

简介: 1 在新插入的对话框中添加两个Picture Control和两个Button 2 打开图像代码和显示图像代码和前面两篇博文类似 BEGIN_MESSAGE_MAP(CEdgeDetDlg, CDialogEx) ON_WM_PAINT() ON_BN_CLICKED(IDC_OPEN_BTN, &CEdgeDetDlg::OnClickedOpenBtn) ON_BN

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);
		}
	}
}
测试时用的是灰度图像,实现效果如下:



目录
相关文章
|
2天前
|
云安全 人工智能 自然语言处理
|
7天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
659 17
|
10天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
728 57
Meta SAM3开源:让图像分割,听懂你的话
|
7天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
328 116
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
482 37
|
22天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
1天前
|
Rust 安全
掌握Rust文件读取(从零开始的IO操作指南)
本教程手把手教你用Rust读取文件,涵盖`read_to_string`一次性读取和`BufReader`逐行高效读取,适合初学者掌握安全、高效的Rust文件操作,助你轻松入门系统编程。
147 113