本科课程【数字图像处理】实验5 - 空洞填充

x33g5p2x  于2022-05-23 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(423)

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.

近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

一、 实验目的

1、 掌握腐蚀和求补集操作的基本算法。
2、 使用二值图像,进行边界提取和区域填充。

二、 实验内容

1. 实验任务

形态学一般是使用二值图像,进行边界提取和区域填充,基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换,边界提取主要涉及腐蚀和求补集操作,本次作业就是利用二值图像进行区域填充。

2. 程序设计

1) 原理
区域填充:指的是在输出平面的闭合区域内完整地填充某种颜色或图案,区域填充的原理是区域填充——A表示一个包含子集的集合,其子集的元素均是区域的8连通边界点,区域填充目的是从边界内的一个点开始,用1(255)填充整个区域。我们将背景点标记为0, 1为区域内的点,则下列过程将整个区域用填充: 如果Xk=Xk-1,则算法在迭代的第k步结束,得到结果。

2) 流程
打开vc++6.0,在mfc处添加区域填充函数,并在相应位置编写算法。我们取结构元素B为十字形,中点在中心,先取一个在边界之内(区域之内)的像素点作为初始条件x0,同时开辟内存,存储一个原图像的反色图像,在使用结构元素B对xk进行膨胀的时候,每膨胀完一次,就与反色图像对应位置的像素点进行比较,如果相同,则增加该点,否则不填充。此循环的结束条件为 (即新的xk与原图A相交),即到达边界,此时循环结束,最后完成区域填充。

3) 数据输出

三、 实验环境

  1. 操作系统:WINDOWS 10
  2. 开发工具:Visual Studio
  3. 实验设备:PC

源代码

  1. void CAView::Onquyutianchong()
  2. {
  3. BackForUndo(GetDocument()->GetHDIB());
  4. // 获取文档
  5. CADoc* pDoc = GetDocument();
  6. // 指向DIB的指针
  7. LPSTR lpDIB;
  8. // 指向DIB象素指针
  9. LPSTR lpDIBBits;
  10. LPSTR lpNewDIBBits;
  11. // 锁定DIB
  12. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
  13. // 更改光标形状
  14. BeginWaitCursor();
  15. lpDIBBits = ::FindDIBBits(lpDIB); // 找到DIB图像像素起始位置
  16. // 图像的宽度和高度
  17. LONG lWidth;
  18. LONG lHeight;
  19. lWidth=::DIBWidth(lpDIB);/* 获取图像的"宽度"(4的倍数)*/
  20. lHeight=::DIBHeight(lpDIB);/*获取图像的高度*/
  21. lpNewDIBBits=new char[sizeof(*lpDIBBits)*lWidth*lHeight];
  22. memcpy(lpNewDIBBits,lpDIBBits,sizeof(*lpDIBBits)*lWidth*lHeight);
  23. //--------------开始实现区域填充
  24. int X, Y;
  25. int Width,Height;
  26. byte * Pointer;
  27. Width = lWidth; Height = lHeight;
  28. for (Y=0;Y<Height;Y++)
  29. {
  30. lpNewDIBBits = lpDIBBits + Y*lWidth;
  31. if (Pointer[0]==0) *lpNewDIBBits=0;
  32. if (lpNewDIBBits [Width-1]==0) *lpNewDIBBits=255;
  33. }
  34. for (X=0;X<Width;X++)
  35. {
  36. lpNewDIBBits = lpDIBBits + X;
  37. if (lpNewDIBBits [0]==0) *lpNewDIBBits=0;
  38. if (lpNewDIBBits [(Height-1)]==0) *lpNewDIBBits=255;
  39. }
  40. for (Y = 0; Y < Height; Y++)
  41. {
  42. lpNewDIBBits = lpDIBBits + Y
  43. for (X = 0; X < Width; X++)
  44. {
  45. if (lpNewDIBBits [X] == 127)
  46. lpNewDIBBits [X] = 0;
  47. else
  48. lpNewDIBBits [X] = 255;
  49. }
  50. }
  51. // 设置脏标记
  52. pDoc->SetModifiedFlag(TRUE);
  53. // 更新视图
  54. pDoc->UpdateAllViews(NULL);
  55. // 解除锁定
  56. ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
  57. // 恢复光标
  58. EndWaitCursor();
  59. }

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

相关文章