图像二值化阀值(Kirsch算子) - ywywcy的专栏 - CSDNBlog
2008-01-15 17:06
393 查看
图像二值化阀值Kirsch算子
Kirsch算子实现起来相对来说稍微麻烦一些,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出(上述算法中用到的8个模板在下面的实现代码中给出)。为了便于读者理解该算法的实现,这里我们给出实现该算法的函数代码,可以稍加改动应用到自己的项目中去。
BOOL Kirsch(BYTE *pData,int Width,int Height)
{//定义实现Kirsch算法的8个模板;
int i,j,s,t,k,max,sum[8];
static a[3][3]={{+5,+5,+5},{-3,0,-3},{-3,-3,-3}};
static a1[3][3]={{-3,+5,+5},{-3,0,+5},{-3,-3,-3}};
static a2[3][3]={{-3,-3,+5},{-3,0,+5},{-3,-3,+5}};
static a3[3][3]={{-3,-3,-3},{-3,0,+5},{-3,+5,+5}};
static a4[3][3]={{-3,-3,-3},{-3,0,-3},{+5,+5,+5}};
static a5[3][3]={{-3,-3,-3},{+5,0,-3},{+5,+5,-3}};
static a6[3][3]={{+5,-3,-3},{+5,0,-3},{+5,-3,-3}};
static a7[3][3]={{+5,+5,-3},{+5,0,-3},{-3,-3,-3}};
BYTE *pData1;
if(pData==NULL)
{
AfxMessageBox("图像数据为空,请读取图像数据!");
return FALSE;
}
pData1=(BYTE*)new char[Width*Height];
if(pData1==NULL)
{
AfxMessageBox("图像缓冲数据区申请失败,请重新申请图像数据缓冲区!");
return FALSE ;
}
memcpy(pData1,pData, Width*8*Height);
//kirsch算子处理,对每一像素点求取八个方向的导数;;
for(i=1;i255)
max=255;
*(pData1+ Width*8*i+j)=max;
}
memcpy(pData,pData1, Width*8*Height);
delete pData1;
return TRUE;
}
本文转自
http://blog.csdn.net/ywywcy/archive/2007/07/24/1704576.aspx
Kirsch算子实现起来相对来说稍微麻烦一些,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出(上述算法中用到的8个模板在下面的实现代码中给出)。为了便于读者理解该算法的实现,这里我们给出实现该算法的函数代码,可以稍加改动应用到自己的项目中去。
BOOL Kirsch(BYTE *pData,int Width,int Height)
{//定义实现Kirsch算法的8个模板;
int i,j,s,t,k,max,sum[8];
static a[3][3]={{+5,+5,+5},{-3,0,-3},{-3,-3,-3}};
static a1[3][3]={{-3,+5,+5},{-3,0,+5},{-3,-3,-3}};
static a2[3][3]={{-3,-3,+5},{-3,0,+5},{-3,-3,+5}};
static a3[3][3]={{-3,-3,-3},{-3,0,+5},{-3,+5,+5}};
static a4[3][3]={{-3,-3,-3},{-3,0,-3},{+5,+5,+5}};
static a5[3][3]={{-3,-3,-3},{+5,0,-3},{+5,+5,-3}};
static a6[3][3]={{+5,-3,-3},{+5,0,-3},{+5,-3,-3}};
static a7[3][3]={{+5,+5,-3},{+5,0,-3},{-3,-3,-3}};
BYTE *pData1;
if(pData==NULL)
{
AfxMessageBox("图像数据为空,请读取图像数据!");
return FALSE;
}
pData1=(BYTE*)new char[Width*Height];
if(pData1==NULL)
{
AfxMessageBox("图像缓冲数据区申请失败,请重新申请图像数据缓冲区!");
return FALSE ;
}
memcpy(pData1,pData, Width*8*Height);
//kirsch算子处理,对每一像素点求取八个方向的导数;;
for(i=1;i255)
max=255;
*(pData1+ Width*8*i+j)=max;
}
memcpy(pData,pData1, Width*8*Height);
delete pData1;
return TRUE;
}
本文转自
http://blog.csdn.net/ywywcy/archive/2007/07/24/1704576.aspx
相关文章推荐
- 图像二值化阀值(Kirsch算子) - ywywcy的专栏 - CSDNBlog
- CString 操作指南 - pinping1314的专栏 - CSDNBlog
- 在VC6.0下设置Unicode编译环境 - 冷秋魂的专栏 - CSDNBlog
- 嵌入式Linux文件系统及其存储机制分析 - farsight嵌入式学习专栏 - CSDNBlog
- 如何用摄像头来测距(opencv) - xylary专栏 - CSDNBlog
- 函数调用堆栈变化分析 - quanming1119的专栏 - CSDNBlog
- eclipse.ini内存设置 - Jenhy的专栏 - CSDNBlog
- 宏与内联函数(面试常考)--转自fisher_jiang的专栏-http://blog.csdn.net/fisher_jiang
- 如何用摄像头来测距(opencv) - xylary专栏 - CSDNBlog
- 图像分割概述(收藏) - ywywcy的专栏 - CSDNBlog
- Android快速入门 - jesun的专栏 - CSDNBlog
- 如何用摄像头来测距(opencv) - xylary专栏 - CSDNBlog
- Java动态显示文件上传进度的简单实现 - java2000.net的专栏 - CSDNBlog
- 超标量、超级流水线、超长指令字、向量机 - blueplain的专栏 - CSDNBlog
- 如何用摄像头来测距(opencv) - xylary专栏 - CSDNBlog
- Unity Mecanim在大型mmo中的应用 - langresser的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/langresser_king/artic
- 理解和正确使用Java中的断言(assert) - Leichelle的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/leichelle/article/deta
- 字节对齐面试题 及面试专栏http://blog.csdn.net/hackbuteer1
- 跳槽――找马时,我被驴发现了(1) - 职业生涯顾问Leo的专栏 - CSDNBlog
- 关于C++ 字节对齐 - zafair的专栏 - CSDNBlog