我要将一幅二值图像的轮廓提取出来,在网上找了一种查找黑点周围八个点的方法,如果一个黑点周围八个点都是黑点,那么将该黑点删除。用该代码完成后发现不能达到目的,程序只能将图像黑色区域变成一道黑一道白的样子,并不能完全将黑色区域内部完全掏空。我是新手,请大家帮我看看代码。谢谢!!!
int num;//相邻八个点灰度值之和
int nw,n,ne,w,e,sw,s,se;//相邻八个点的灰度值long i;
long j;//循环变量unsigned char pixel;//当前点灰度值for (i = 1;i <m_Height-1;i++)
{
for(j = 1;j < m_Width-1;j++)
{
pixel = (unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3);
//m_lpDibbitsChg是指向源图像的指针,m_Height是图像高度,m_Width是图像宽度,m_bytePerLine是图像每行字节数 if(pixel==(unsigned char)0)//如果当前点为黑点,求其相邻八点的灰度值
{
nw=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+(j-1)*3);
n=(unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+(j-1)*3);
ne=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+(j-1)*3);
w=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+j*3);
e=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+j*3);
sw=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+(j+1)*3);
s=(unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+(j+1)*3);
ne=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+(j+1)*3);
num=nw+n+ne+w+e+sw+s+se;
if(num==0) //说明都是黑点
{
*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3) = (unsigned char)255;
*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3+1) = (unsigned char)255;
*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3+2) = (unsigned char)255; //删除该黑点
}
}
}
}
解决方案 »
- 界面 刷新问题 百思不得其解
- release版本显示找不到头文件,debug版本正常
- 帮帮忙啊
- 求html转换word的代码
- ■■■■■求助:OCX注册失败!!!!!DllRegisterServer 失败.错误码:0x80040200.....谢谢~~~
- 一个很少有人问的问题。
- 有关串口和数据库的中和问题,求救
- 新手疑问:创建窗口扩展函数CreateWindowEx()是干什么用的?
- CTreeView如何设置某一项的Enable状态
- MFC static text 设置背景透明失败
- dsoframer open(url) url含有中文字符,,请问怎么解决???
- 小弟,要做图象放大的毕业设计,过几天要交了,恳求大虾给发个三次样条插值图象放大的原代码,急 !!!先谢过了 邮箱[email protected]
因此,你在
if(num==0) //说明都是黑点
{
*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3) = (unsigned char)255; *(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3+1) = (unsigned char)255; *(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3+2) = (unsigned char)255; //删除该黑点
}
时,不能立即修改该点的颜色,否则会影响到其它点的判断。你应该将该点的位置先记录下来,等所有点判断完成后,再将所有记录的点的颜色全部改成白色才可以。
#include <afxtempl.h>
typedef CArray<CPoint,CPoint&> CPointArray;
CPointArray arBlackPt;
int num;//相邻八个点灰度值之和
int nw,n,ne,w,e,sw,s,se;//相邻八个点的灰度值 long i;
long j;//循环变量 unsigned char pixel;//当前点灰度值 for (i = 1;i <m_Height-1;i++)
{
for(j = 1;j < m_Width-1;j++)
{
pixel = (unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+j*3);
//m_lpDibbitsChg是指向源图像的指针,m_Height是图像高度,m_Width是图像宽度,m_bytePerLine是图像每行字节数 if(pixel==(unsigned char)0)//如果当前点为黑点,求其相邻八点的灰度值
{
nw=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+(j-1)*3); n=(unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+(j-1)*3);
ne=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+(j-1)*3);
w=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+j*3);
e=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+j*3);
sw=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i-1)-1)*m_bytePerLine+(j+1)*3);
s=(unsigned char)*(m_lpDibbitsChg+(m_Height-i-1)*m_bytePerLine+(j+1)*3);
ne=(unsigned char)*(m_lpDibbitsChg+(m_Height-(i+1)-1)*m_bytePerLine+(j+1)*3);
num=nw+n+ne+w+e+sw+s+se;
if(num==0) //说明都是黑点
{
CPoint pt;
pt.x = i;
pt.y = j;
arBlackPt.Add(pt);
}
}
}
}
int nSize = arBlackPt.GetSize();
for(int i=0; i<nSize; i++)
{
CPoint pt = arBlackPt.GetAt(i);
*(m_lpDibbitsChg+(m_Height-pt.x-1)*m_bytePerLine+pt.y*3) = (unsigned char)255; *(m_lpDibbitsChg+(m_Height-pt.x-1)*m_bytePerLine+pt.y*3+1) = (unsigned char)255; *(m_lpDibbitsChg+(m_Height-pt.x-1)*m_bytePerLine+pt.y*3+2) = (unsigned char)255; //删除该黑点
}