wenluderen
论坛版主
论坛版主
  • 最后登录2018-10-18
  • 发帖数313
  • 金币5680枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:1364回复:1

Visual C++ 数字图像处理:线性变换。

楼主#
更多 发布于:2015-03-14 10:15
上篇帖子(http://www.ihalcon.com/read-2932.html)说道了DIB图像的反色,当时这是创建了视图类的:OnFileOpen() 函数。在函数里面进行一堆折腾,最终实现了反色。
本帖和上一贴最大的区别是增加了一个对话框用于调整参数。本帖不过分关心这个线性变换函数的实现过程。
只是对这个常见用对话框输入参数的写方程模式进行探讨。目的是以后可以自由自在的写出类似的程序。
好了,闲言少叙,书归正传。


一:在我们以前创建的程序中,我添加了一个菜单栏。菜单栏中有个按钮叫:线性变换(ID_POINT_LINER)。
使用类向导,创建视图类的这个按钮单击的响应函数。
void CGszTestView::OnPointLiner()
二:在里面添加实现代码

// TODO: 在此添加命令处理程序代码
 // 线性变换


 // 获取文档
 CGszTestDoc* pDoc = GetDocument();


 // 指向DIB的指针
 LPSTR lpDIB;


 // 指向DIB象素指针
 LPSTR    lpDIBBits;


 // 创建对话框
 CDlgLinerPara dlgPara;


 // 线性变换的斜率
 FLOAT fA;


 // 线性变换的截距
 FLOAT fB;


 // 锁定DIB
 lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());


 // 找到DIB图像象素起始位置
 lpDIBBits = ::FindDIBBits(lpDIB);


 // 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的线性变换,其它的可以类推)
 if (::DIBNumColors(lpDIB) != 256)
 {
 // 提示用户
 MessageBox("目前只支持256色位图的线性变换!", "系统提示" , MB_ICONINFORMATION | MB_OK);


 // 解除锁定
 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());


 // 返回
 return;
 }


 // 初始化变量值
 dlgPara.m_fA = 2.0;
 dlgPara.m_fB = -128.0;




 // 显示对话框,提示用户设定平移量
 if (dlgPara.DoModal() != IDOK)
 {
 // 返回
 return;
 }


 // 获取用户设定的平移量
 fA = dlgPara.m_fA;
 fB = dlgPara.m_fB;


 // 删除对话框
 delete dlgPara;


 // 更改光标形状
 BeginWaitCursor();


 // 调用LinerTrans()函数进行线性变换
 LinerTrans(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), fA, fB);


 // 设置脏标记
 pDoc->SetModifiedFlag(TRUE);


 // 更新视图
 pDoc->UpdateAllViews(NULL);


 // 解除锁定
 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());


 // 恢复光标
 EndWaitCursor();
喜欢0

最新打赏:0人

aiyahoo
工程师
工程师
  • 最后登录2018-10-12
  • 发帖数54
  • 金币633枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
沙发#
发布于:2015-03-14 13:47
沙发,建议楼主整理出图像处理系列讲义~~
游客

返回顶部
支付

欢迎打赏,请选择打赏金额

  • 1元
  • 6元
  • 10元
  • 66元
  • 100元

支付即代表同意《本站支付协议》 有疑问请联系客服