细化算法
⑴ 基于轮廓的细化算法
。。轮廓?计算机图形学~~
我现在搞的项目就涉及轮廓查找
我用的是OpenCV,是一个开源的算法,基于VC,里面有大量的算法,当然包括了
轮廓的查找算法~~有好几个
可以搜索OpenCV关键字~~
⑵ 谁有好的细化算法为什么OPENCV里没有提供这个算法
你可以看一下zhang-suen-thinning-algorithm.
到:
answers.opencv.org/question/3207/what-is-a-good-thinning-algorithm-for-getting-the-skeleton-of-characters-for-ocr/
找点启发。
⑶ 这是zhang-suen快速并行骨架细化算法matlab程序
你的文件不全,比如少了数据文件...
你可以先定义 mtimes=1 或者0 啊
这样这个error没了,但其他error估计会出来,一个一个解决掉吧
⑷ 谁有指纹图像细化算法的快速细化算法的仿真程序呢
俺真的不知道,不好意思啊
⑸ 求 c# Hilditch细化算法
/**//// <summary>
/// 该函数用于对图像进行细化运算。要求目标图像为灰度图像
/// </summary>
/// <param name="dgGrayValue"></param>
public void ThiningPic(Bitmap bmpobj,int dgGrayValue)
{
int lWidth = bmpobj.Width;
int lHeight = bmpobj.Height;
// Bitmap newBmp = new Bitmap(lWidth, lHeight);
bool bModified; //脏标记
int i, j, n, m; //循环变量
Color pixel; //像素颜色值
//四个条件
bool bCondition1;
bool bCondition2;
bool bCondition3;
bool bCondition4;
int nCount; //计数器
int[,] neighbour = new int[5, 5]; //5×5相邻区域像素值
bModified = true;
while (bModified)
{
bModified = false;
//由于使用5×5的结构元素,为防止越界,所以不处理外围的几行和几列像素
for (j = 2; j < lHeight - 2; j++)
{
for (i = 2; i < lWidth - 2; i++)
{
bCondition1 = false;
bCondition2 = false;
bCondition3 = false;
bCondition4 = false;
if (bmpobj.GetPixel(i, j).R > dgGrayValue)
{
if(bmpobj.GetPixel(i, j).R<255)
bmpobj.SetPixel(i, j, Color.Black);
continue;
}
//获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
for (m = 0; m < 5; m++)
{
for (n = 0; n < 5; n++)
{
neighbour[m, n] = bmpobj.GetPixel(i + m - 2, j + n - 2).R < dgGrayValue ? 1 : 0;
}
}
//逐个判断条件。
//判断2<=NZ(P1)<=6
nCount = neighbour[1, 1] + neighbour[1, 2] + neighbour[1, 3]
+ neighbour[2, 1] + neighbour[2, 3] +
+neighbour[3, 1] + neighbour[3, 2] + neighbour[3, 3];
if (nCount >= 2 && nCount <= 6)
{
bCondition1 = true;
}
//判断Z0(P1)=1
nCount = 0;
if (neighbour[1, 2] == 0 && neighbour[1, 1] == 1)
nCount++;
if (neighbour[1, 1] == 0 && neighbour[2, 1] == 1)
nCount++;
if (neighbour[2, 1] == 0 && neighbour[3, 1] == 1)
nCount++;
if (neighbour[3, 1] == 0 && neighbour[3, 2] == 1)
nCount++;
if (neighbour[3, 2] == 0 && neighbour[3, 3] == 1)
nCount++;
if (neighbour[3, 3] == 0 && neighbour[2, 3] == 1)
nCount++;
if (neighbour[2, 3] == 0 && neighbour[1, 3] == 1)
nCount++;
if (neighbour[1, 3] == 0 && neighbour[1, 2] == 1)
nCount++;
if (nCount == 1)
bCondition2 = true;
//判断P2*P4*P8=0 or Z0(p2)!=1
if (neighbour[1, 2] * neighbour[2, 1] * neighbour[2, 3] == 0)
{
bCondition3 = true;
}
else
{
nCount = 0;
if (neighbour[0, 2] == 0 && neighbour[0, 1] == 1)
nCount++;
if (neighbour[0, 1] == 0 && neighbour[1, 1] == 1)
nCount++;
if (neighbour[1, 1] == 0 && neighbour[2, 1] == 1)
nCount++;
if (neighbour[2, 1] == 0 && neighbour[2, 2] == 1)
nCount++;
if (neighbour[2, 2] == 0 && neighbour[2, 3] == 1)
nCount++;
if (neighbour[2, 3] == 0 && neighbour[1, 3] == 1)
nCount++;
if (neighbour[1, 3] == 0 && neighbour[0, 3] == 1)
nCount++;
if (neighbour[0, 3] == 0 && neighbour[0, 2] == 1)
nCount++;
if (nCount != 1)
bCondition3 = true;
}
//判断P2*P4*P6=0 or Z0(p4)!=1
if (neighbour[1, 2] * neighbour[2, 1] * neighbour[3, 2] == 0)
{
bCondition4 = true;
}
else
{
nCount = 0;
if (neighbour[1, 1] == 0 && neighbour[1, 0] == 1)
nCount++;
if (neighbour[1, 0] == 0 && neighbour[2, 0] == 1)
nCount++;
if (neighbour[2, 0] == 0 && neighbour[3, 0] == 1)
nCount++;
if (neighbour[3, 0] == 0 && neighbour[3, 1] == 1)
nCount++;
if (neighbour[3, 1] == 0 && neighbour[3, 2] == 1)
nCount++;
if (neighbour[3, 2] == 0 && neighbour[2, 2] == 1)
nCount++;
if (neighbour[2, 2] == 0 && neighbour[1, 2] == 1)
nCount++;
if (neighbour[1, 2] == 0 && neighbour[1, 1] == 1)
nCount++;
if (nCount != 1)
bCondition4 = true;
}
if (bCondition1 && bCondition2 && bCondition3 && bCondition4)
{
bmpobj.SetPixel(i, j, Color.White);
bModified = true;
}
else
{
bmpobj.SetPixel(i, j, Color.Black);
}
}
}
}
// 复制细化后的图像
// bmpobj = newBmp;
}
⑹ 有没有关于指纹图像二值化与细化算法的matlab程序 谢谢!
这是指纹识别的预处理算法;拍摄的原始图片中螺纹颜色为白色,底色为黑色。
首先是去噪;如果某点为白色,且它的8领域内白点数目小于3那么判定它为干扰信号,置为背景黑色。如果某点位黑色,但它的8领域内白点数大于7个;判定它为干扰信号,置为螺纹的白色。
最后反色,置为螺纹黑色,底色白色,大概是为便于观察把
⑺ 用自顶向下,逐步细化的方法进行以下算法设计:求出1900~2000中是闰年的年份
1904,1908,1912,1916,1920...1992,1996,2000总共25个闰年。
方法利用EXCEL 函数,首先在一张新建的空白EXCEL表格A1处填上数字1900,然后下拉至A101,选择以序列形式填充,这样就出来了一列数字,从1900知道2000,然后再B1单元格设置函数公式,=IF(MOD(A1,4)+(INT(A1%)=A1%)*MOD(A1%,4),"平年","闰年"),鼠标拖下来就出来所有的闰年和平年,然后数据-筛选,把所有平年的筛出来删掉,剩下都是闰年,在C1出写1,下拖鼠标至最后一个闰年所在的行C25,得出闰年共25个
⑻ 关于Zhang并行细化算法
数组初始化出错
⑼ 怎么用求解
百钱买百鸡问题——一百个铜钱买了一百只鸡,其中公鸡一只5钱、母鸡一只3钱,小鸡一钱3只,问一百只鸡中公鸡、母鸡、小鸡各多少)。这是一个古典数学问题,设一百只鸡中公鸡、母鸡、小鸡分别为x,y,z,问题化为三元一次方程组: 这里x,y,z为正整数,且z是3的倍数;由于鸡和钱的总数都是100,可以确定x,y,z的取值范围: 1) x的取值范围为1~20 2) y的取值范围为1~33 3) z的取值范围为3~99,步长为3 对于这个问题我们可以用穷举的方法,遍历x,y,z的所有可能组合,最后得到问题的解。数据要求问题中的常量:无问题的输入:无问题的输出: int x,y,z /*公鸡、母鸡、小鸡的只数*/ 初始算法 1.初始化为1; 2.计算x循环,找到公鸡的只数; 3.计算y循环,找到母鸡的只数; 4.计算z循环,找到小鸡的只数; 5.结束,程序输出结果后退出。算法细化算法的步骤1实际上是分散在程序之中的,由于用的是for循环,很方便的初始条件放到了表达式之中了。步骤2和3是按照步长1去寻找公鸡和母鸡的个数。步骤4的细化 4.1 z=1 4.2 是否满足百钱,百鸡 4.2.1 满足,输出最终百钱买到的百鸡的结果 4.2.2 不满足,不做处理 4.3 变量增加,这里注意步长为3 流程图 图5-8 程序执行流程图程序代码如下 #include "stdio.h" main() { int x,y,z; for(x=1;x<=20;x++) for(y=1;y<=33;y++) for(z=3;z<=99;z+=3) { if((5*x+3*y+z/3==100)&&(x+y+z==100))/*是否满足百钱和百鸡的条件*/ printf("cock=%d,hen=%d,chicken=%d\n",x,y,z); } } 分析程序运行结果如下: cock=4,hen=8,chicken=78 cock=8,hen=11,chicken=81 cock=12,hen=4,chicken=84 对于这个问题实际上可以不用三重循环,而是用二重循环,因为公鸡和母鸡数确定后,小鸡数就定了,即 。请同学们自己分析二重循环和三重循环的运行次数,做为练习自己调试这一方法。 参考资料:东北大学计算中心 --网络文库
⑽ Zhang并行快速细化算法中p2*p4*p6=0 、p4*p6*p8=0是什么意思
p2*p4*p6=0表示当前点的p2,p4,p6三个领域像素至少有一个灰度值为零。