社区
图形处理/算法
帖子详情
求二值图像、灰度图象的腐蚀与膨胀算法!
maplewasp
2006-11-27 10:48:21
求二值图像、灰度图象的腐蚀与膨胀算法!有源程序最好!
谢谢先!
...全文
819
5
打赏
收藏
求二值图像、灰度图象的腐蚀与膨胀算法!
求二值图像、灰度图象的腐蚀与膨胀算法!有源程序最好! 谢谢先!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
iohui
2006-11-29
打赏
举报
回复
膨胀
void Dilation(HANDLE hDIB)
{
LPBITMAPINFOHEADER lpbi;
int height;
int width;
WORD wBytesPerLine;
LPBYTE lpData;
LPBYTE lpTemp;
long lOffset;
//得到图象的基本信息
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
height = lpbi->biHeight;
width = lpbi->biWidth;
wBytesPerLine = this->BytePerLine(hDIB);
lpData = this->FindDIBBits(hDIB);
//申请一块和数据区大小相同的内存
lpTemp = (LPBYTE) new BYTE[wBytesPerLine * height];
long lOffsetJudge;
int i;
for (i=1; i<height-1; i++)
for (int j=1; j<width-1; j++)
{
lOffset = this->PixelOffset(i, j, wBytesPerLine);
//如果当前点为白色,接着循环
if(*(lpData + lOffset) == 255)
{
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
continue;
}
//否则考察上下左右四个点
else
{
lOffsetJudge = this->PixelOffset(i-1, j, wBytesPerLine);
//如果上面的点为白色
if(*(lpData + lOffsetJudge) == 255)
{ //设置为白色,并继续循环
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
continue;
}
//考察下面的点
lOffsetJudge = this->PixelOffset(i+1,j, wBytesPerLine);
if(*(lpData + lOffsetJudge) == 255)
{
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
continue;
}
//考察左边的点
lOffsetJudge = this->PixelOffset(i,j-1, wBytesPerLine);
if(*(lpData + lOffsetJudge) == 255)
{
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
continue;
}
//考察右边的点
lOffsetJudge = this->PixelOffset(i,j+1, wBytesPerLine);
if(*(lpData + lOffsetJudge) == 255)
{
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
*(lpTemp + lOffset++) = 255;
continue;
}
//如果上下左右都是黑色点,则把暂时区域的点设置为黑色
lOffset = this->PixelOffset(i,j,wBytesPerLine);
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
}
}
//处理图象四周的点,设置为黑色
for(i=0; i<height; i++)
{
lOffset = this->PixelOffset(i, 0, wBytesPerLine);
{
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
}
}
for(i=0; i<height; i++)
{
lOffset = this->PixelOffset(i, width-1, wBytesPerLine);
{
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
}
}
for(i=0; i<width; i++)
{
lOffset = this->PixelOffset(0, i, wBytesPerLine);
{
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
}
}
for(i=0; i<width; i++)
{
lOffset = this->PixelOffset(height-1, i, wBytesPerLine);
{
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
}
}
//把暂时区域的点拷贝到原句柄区域下面
memcpy(lpData, lpTemp, wBytesPerLine*height);
delete [] lpTemp;
GlobalUnlock(hDIB);
}
iohui
2006-11-29
打赏
举报
回复
腐蚀
void Erasion(HANDLE hDIB)
{
LPBITMAPINFOHEADER lpbi;
LPBYTE lpData;
WORD wBytesPerLine;
long lOffset;
long lOffsetJudge;
int height;
int width;
//得到基本数据
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
height = lpbi->biHeight;
width = lpbi->biWidth;
wBytesPerLine = BytePerLine(hDIB);
lpData = FindDIBBits(hDIB);
HANDLE hTempDIB;
LPBYTE lpTemp;
//申请同样大小的内存
hTempDIB = GlobalAlloc(GMEM_MOVEABLE,(DWORD)(sizeof(BITMAPINFOHEADER) + wBytesPerLine*height));
//判断内存情况
if(!hTempDIB)
{
GlobalFree(hTempDIB);
GlobalFree(hDIB);
return;
}
lpTemp = (LPBYTE)GlobalLock(hTempDIB);
lpTemp+= sizeof(BITMAPINFOHEADER);
//下面的循环实现腐蚀功能
for (int i=1; i<height-1; i++)
for (int j=1; j<width-1; j++)
{
lOffset = PixelOffset(i,j,wBytesPerLine);
//如果为白色点
if (*(lpData+lOffset) == 255)
{
//考察上面的点
lOffsetJudge = PixelOffset(i-1, j, wBytesPerLine);
//如果是黑色就把原来的点设置为黑色,并接着循环
if (*(lpData + lOffsetJudge) ==0)
{
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
continue;
}
//考察下面的点
lOffsetJudge = PixelOffset(i+1, j, wBytesPerLine);
if (*(lpData + lOffsetJudge) ==0)
{
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
continue;
}
//左面的点
lOffsetJudge = PixelOffset(i, j-1, wBytesPerLine);
if (*(lpData + lOffsetJudge) ==0)
{
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
continue;
}
//右面的点
lOffsetJudge = PixelOffset(i, j+1, wBytesPerLine);
if (*(lpData + lOffsetJudge) ==0)
{
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
*(lpTemp + lOffset++) = 0;
continue;
}
//如果上下左右四个点都是白色,则设置为白色
lOffset = this->PixelOffset(i, j, wBytesPerLine);
*(lpTemp + lOffset) = 255;
*(lpTemp + lOffset+1) = 255;
*(lpTemp + lOffset+2) = 255;
}
//如果当前点为黑色,则在暂时的目标区域中设置为黑色
else
{
*(lpTemp + lOffset) = 0;
*(lpTemp + lOffset+1) = 0;
*(lpTemp + lOffset+2) = 0;
}
}
//把图象周边的点全部设置为黑色
for(i=0; i<height; i++)
{
lOffset = PixelOffset(i, 0, wBytesPerLine);
*(lpTemp + lOffset) = 0;
*(lpTemp + lOffset+1) = 0;
*(lpTemp + lOffset+2) = 0;
}
for(i=0; i<height; i++)
{
lOffset = PixelOffset(i, width-1, wBytesPerLine);
*(lpTemp + lOffset) = 0;
*(lpTemp + lOffset+1) = 0;
*(lpTemp + lOffset+2) = 0;
}
for (i=0; i<width; i++)
{
lOffset = PixelOffset(0, i, wBytesPerLine);
*(lpTemp + lOffset) = 0;
*(lpTemp + lOffset+1) = 0;
*(lpTemp + lOffset+2) = 0;
}
for (i=0; i<width; i++)
{
lOffset = PixelOffset(height-1, i, wBytesPerLine);
*(lpTemp + lOffset) = 0;
*(lpTemp + lOffset+1) = 0;
*(lpTemp + lOffset+2) = 0;
}
//把暂时区域的数值拷贝到原来的句柄下面
memcpy(lpData,lpTemp,wBytesPerLine*height);
GlobalUnlock(hDIB);
GlobalUnlock(hTempDIB);
GlobalFree(hTempDIB);
}
maplewasp
2006-11-28
打赏
举报
回复
我模仿CxImage里的Erode和Dilate两函数,但是始终不成功,不知道为什么?
还想问一下,CxImage里的这两个算法的效果怎么样?
脆弱的肠胃
2006-11-28
打赏
举报
回复
同意,但是算法不算高效
HUNTON
2006-11-28
打赏
举报
回复
找一本图形的书来,里面一般都有这些的。
灰度图
象
的
腐蚀
算法
c语言版的
对于
二值图像
(黑白色),匹配通常是基于像素的黑白状态,而在
灰度图
像中,匹配可能基于灰度值的阈值或某种比较操作。 C语言实现
腐蚀
算法
,通常涉及以下步骤: 1. 定义结构元素:结构元素通常是小的矩阵,如3x3或5...
C++实现
灰度图
像的
腐蚀
、
膨胀
、细化运算
在图像处理领域,
腐蚀
、
膨胀
和细化是基本的形态学操作,主要应用于
二值图像
,但也可以扩展到
灰度图
像。这些操作对于图像分析、噪声去除、边缘检测和形状提取等任务至关重要。以下是对这些概念的详细解释: 1. **...
灰度图
象
的
膨胀
算法
c语言版的
2. **
二值图像
与
灰度图
像的区别**: 在
二值图像
中,像素只有两种状态,通常是黑色和白色,而
灰度图
像则有连续的灰度等级,从黑到白表示不同的亮度。在
膨胀
二值图像
时,我们通常关心的是物体边界,而在
灰度图
像中,...
商业编程-源码-图
象
腐蚀
,
膨胀
,细化
算法
.zip
在数字图像处理领域,形态学操作是图像分析的基石,它们针对的是
二值图像
,即仅由黑与白组成,无灰度值的图像。形态学
算法
是图像处理中不可或缺的工具,广泛应用于图像分割、特征提取、噪声过滤、边缘强化等众多场景...
图
象
腐蚀
,
膨胀
,细化
算法
.(17KB)
这些
算法
基于数学形态学理论,主要在
二值图像
(黑与白)上进行操作,但也可以扩展到
灰度图
像。 首先,让我们详细了解一下每个操作: 1. **图
象
腐蚀
**:
腐蚀
操作是一种减小物体面积的过程,它将图像中的白色区域...
图形处理/算法
19,473
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章