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

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

大家好,我是【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

源代码

void CAView::Onquyutianchong() 
{

		BackForUndo(GetDocument()->GetHDIB());
	// 获取文档
	CADoc* pDoc = GetDocument();
	
	// 指向DIB的指针
	LPSTR	lpDIB;

	// 指向DIB象素指针
	LPSTR   lpDIBBits;
	LPSTR   lpNewDIBBits;
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 更改光标形状
	BeginWaitCursor();

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

	// 图像的宽度和高度
	LONG	lWidth;
	LONG	lHeight;
		
	lWidth=::DIBWidth(lpDIB);/* 获取图像的"宽度"(4的倍数)*/
	lHeight=::DIBHeight(lpDIB);/*获取图像的高度*/
    lpNewDIBBits=new char[sizeof(*lpDIBBits)*lWidth*lHeight];
	memcpy(lpNewDIBBits,lpDIBBits,sizeof(*lpDIBBits)*lWidth*lHeight);

//--------------开始实现区域填充
	int X, Y;
        int Width,Height;
        byte * Pointer;
        Width = lWidth; Height = lHeight;
        for (Y=0;Y<Height;Y++)
        {
            lpNewDIBBits = lpDIBBits + Y*lWidth;
            if (Pointer[0]==0) *lpNewDIBBits=0;
            if (lpNewDIBBits [Width-1]==0) *lpNewDIBBits=255;
        }
        for (X=0;X<Width;X++)
        {
            lpNewDIBBits = lpDIBBits + X;
            if (lpNewDIBBits [0]==0) *lpNewDIBBits=0;
            if (lpNewDIBBits [(Height-1)]==0) *lpNewDIBBits=255;
        }
            for (Y = 0; Y < Height; Y++)
            {
                lpNewDIBBits = lpDIBBits + Y
                for (X = 0; X < Width; X++)
                {
                    if (lpNewDIBBits [X] == 127)
                        lpNewDIBBits [X] = 0;
                    else
                        lpNewDIBBits [X] = 255;
                }
            }
		// 设置脏标记
		pDoc->SetModifiedFlag(TRUE);

		// 更新视图
		pDoc->UpdateAllViews(NULL);
	
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();

}

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

相关文章