12.4.3 图像识别(3)
运行程序,实现后的效果如图12.15和图12.16所示。
|
| 图12.15 图像膨胀处理后效果 |
|
| 图12.16 图像填充处理后效果 |
(8)经过膨胀和填充处理后图像中依然存在不完整的图像元素,需要删去图像边缘不完整的图形。通过移除与边界相连通的目标,在MATLAB命令窗口中输入如下代码:
- >> BW4=imclearborder(BW3,4);
- >>figure,imshow(BW4);
运行程序,得到如图12.17所示结果。
|
| 图12.17 图像最终分割效果图 |
(9)最后通过统计计算函数,计算图像中药丸数目。在MATLAB命令窗口输入如下代码:
- >> [labeled numpills]=bwlabel(BW4,4);
- >> numpills
- numpills =
- 10
可见计算结果与实际图像中的结果相符,从而实现了通过图像识别进行药丸计数的功能。
2.使用Visual C++(www.cppentry.com)设计界面并调用MATLAB引擎
使用Visual C++(www.cppentry.com)设计的界面如图12.18所示,包括图像预处理、图像处理和识别、计数结果查看等功能。其中,图像预处理包括打开原始图像、处理成灰度图像、中值滤波处理等功能,图像处理和识别包括图像分割处理、图像边缘检测、图像膨胀填充处理和删除不清晰边缘等功能。按照功能设定相应的按钮,添加一个编辑框控件显示计数结果值,用显示图像的Picture控件来显示要识别的原始图像。
|
| (点击查看大图)图12.18 设计的用户界面 |
为了在界面的Picture控件上显示原始图像,需要在对话框类的OnPaint()函数中添加以下代码:
- void CTestMatlabEngineDlg::OnPaint()
- {
- CBitmap bmp;
- HBITMAP hbmp;
- CString strpicname;
- //将pStatic指向要显示图片的地方
- CStatic *pPicture;
- pPicture=(CStatic*)GetDlgItem(IDC_PICTURE);//IDC_PHOTO为picture控件ID
- strpicname="D:\\VCMatlabTest\\PillCaculation\\pill.bmp";
- //加载资源 hbmp=(HBITMAP)::LoadImage(NULL,
strpicname,IMAGE_BITMAP, 0,0,LR_LOADFROMFILE|LR_
CREATEDIBSECTION);//strpicname为图片的名字 - bmp.Attach(hbmp);//获得加载图片的句柄
- //获取图片格式
- BITMAP bmInfo;
- bmp.GetBitmap(&bmInfo);
- //创建设备内存
- CDC dcMem;
- dcMem.CreateCompatibleDC(GetDC());
- CBitmap *pOldmap=(CBitmap*)dcMem.SelectObject(bmp);
- //获得矩形区域
- CRect lRect;
- pPicture->GetClientRect(&lRect);
- // ScreenToClient(&lRect);
- //显示位图
- pPicture->GetDC()->StretchBlt(lRect.left,lRect.top,
lRect.Width(),lRect. Height(),&dcMem,0,0,bmInfo.bmWidth,bmInfo.bmHeight,SRCCOPY); - dcMem.SelectObject(&pOldmap);
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- // Center icon in client rectangle
- 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;
- // Draw the icon
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CDialog::OnPaint();
- }
- }