深之JohnChen的专栏

人生就象一杯苦酒,你可以用一生的时间喝完,也可以在短短的几年里喝完,然后就会喝甜酒。

john ChenID:byxdaz
597185次访问,排名62好友5人,关注者32
byxdaz的文章
原创 250 篇
翻译 0 篇
转载 226 篇
评论 225 篇
byxdaz的公告
★★★★★★欢迎访问深之JohnChen的BLOG!
最近评论
yzy912:我现在做轨迹拟合,就是有一些车辆跑过之后的运行轨迹,利用这些轨迹拟合出一条曲线,不知道老兄能否给些指点
fftaks:wow power leveling
fftaks:Wow gold
myshijieye:高压断路器
高压开关柜
开关柜
电工电气产品加工
高压成套电器
收藏
    相册
    imageprocess
    搞笑图片
    年历
    My Links
    CSDNBlog
    个人网站
    友情连接
    TOP 10
    2007年年历
    世界上唯一7星级酒店
    中国魅力50人
    中文圣经目录
    改革出了什么问题--郎咸平清华演讲
    电子图书
    英国杂志选出的2007年度世界最性感女性
    西方油画佳作
    超完美12星座戒指
    雅趣技术网
    便民服务
    IP地址、手机号码、身份证查询
    万年历查询
    免费取名网站
    全国铁路交通信息查询
    在线翻译
    天气预报
    房租网
    火车时刻表查询
    航班时刻查询系统
    酒店信息查询
    个人简介
    JohnChen之家
    E-mail: cn770880@21cn.com
    Name:深之JohnChen
    管理知识网站
    IT经理世界
    世界经理人网站
    信息周刊
    支点网-信息化
    软件工程专家网
    免费数码杂志
    时事政治经济综合性免费电子杂志
    时代财富视觉
    榕树下·网友文摘
    爱电影、流行音乐
    营销知识网站
    E-WORKS
    SEO中国
    中国制造网
    中国销售网
    中国销售论坛
    客齐集
    友情Blog
    Linux中国社区
    中华帝国的BLOG
    中国丫头
    人生攻略
    凌学文的博客(凌学文/执业分析师)
    吴小莉的BLOG
    数字水印技术
    易网
    王小丫的BLOG
    老康之家
    娱乐频道
    丽影BT中心
    天涯社区BBS
    影视帝国
    网娱先锋(免费电影网站)
    音乐网
    资料中心
    CSDN首页
    E书下载
    IBM在线教程
    Java视线
    游戏制作人的中文网络平台游戏
    西安资讯网
    资源
    下载Firefox浏览器
    访问sourceForge网站
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 图象细化算法大全收藏

    新一篇: 图象的骨架提取算法 | 旧一篇: 字符的生成

    #include "StdAfx.h"
    #include <stdlib.h>
    #include <malloc.h>

    void beforethin(unsigned char *ip, unsigned char *jp, 
                    unsigned long lx, unsigned long ly)
    {
        unsigned long i,j;
        for(i=0; i<ly; i++)
        {
            for(j=0; j<lx; j++)
            {
                //这里要视前景是白点还是黑点而定,可以改动
                //如果前景是白点,就是这样;反之反过来
                if(ip[i*lx+j]>0)
                    jp[i*lx+j]=1;
                else
                    jp[i*lx+j]=0;
            }
        }
    }

    /////////////////////////////////////////////////////////////////////////
    //Hilditch细化算法
    //功能:对图象进行细化
    //参数:image:代表图象的一维数组
    //      lx:图象宽度
    //      ly:图象高度
    //      无返回值
    void ThinnerHilditch(void *image, unsigned long lx, unsigned long ly)
    {
        char *f, *g;
        char n[10];
        unsigned int counter;
        short k, shori, xx, nrn;
        unsigned long i, j;
        long kk, kk11, kk12, kk13, kk21, kk22, kk23, kk31, kk32, kk33, size;
        size = (long)lx * (long)ly;
        g = (char *)malloc(size);

        if(g == NULL)
        {
            printf("error in allocating memory!\n");
            return;
        }

        f = (char *)image;
        for(i=0; i<lx; i++)
        {
            for(j=0; j<ly; j++)
            {
                kk=i*ly+j;
                if(f[kk]!=0)
                {
                    f[kk]=1;
                    g[kk]=f[kk];
                }
            }
        }

        counter = 1;

        do
        {
            printf("%4d*",counter);
            counter++;
            shori = 0;

            for(i=0; i<lx; i++)
            {
                for(j=0; j<ly; j++)
                {
                    kk = i*ly+j;
                    if(f[kk]<0)
                        f[kk] = 0;
                    g[kk]= f[kk];
                }
            }

            for(i=1; i<lx-1; i++)
            {
                for(j=1; j<ly-1; j++)
                {
                    kk=i*ly+j;

                    if(f[kk]!=1)
                        continue;

                    kk11 = (i-1)*ly+j-1;
                    kk12 = kk11 + 1;
                    kk13 = kk12 + 1;
                    kk21 = i*ly+j-1;
                    kk22 = kk21 + 1;
                    kk23 = kk22 + 1;
                    kk31 = (i+1)*ly+j-1;
                    kk32 = kk31 + 1;
                    kk33 = kk32 + 1;

                    if((g[kk12]&&g[kk21]&&g[kk23]&&g[kk32])!=0)
                        continue;

                    nrn = g[kk11] + g[kk12] + g[kk13] + g[kk21] + g[kk23] + 
                        g[kk31] + g[kk32] + g[kk33];

                    if(nrn <= 1)
                    {
                        f[kk22] = 2;
                        continue;
                    }

                    n[4] = f[kk11];
                    n[3] = f[kk12];
                    n[2] = f[kk13];
                    n[5] = f[kk21];
                    n[1] = f[kk23];
                    n[6] = f[kk31];
                    n[7] = f[kk32];
                    n[8] = f[kk33];
                    n[9] = n[1];
                    xx = 0;

                    for(k=1; k<8; k=k+2)
                    {
                        if((!n[k])&&(n[k+1]||n[k+2]))
                            xx++;
                    }

                    if(xx!=1)
                    {
                        f[kk22] = 2;
                        continue;
                    }

                    if(f[kk12] == -1)
                    {
                        f[kk12] = 0;
                        n[3] = 0;
                        xx = 0;

                        for(k=1; k<8; k=k+2)
                        {
                            if((!n[k])&&(n[k+1]||n[k+2]))
                                xx++;
                        }

                        if(xx != 1)
                        {
                            f[kk12] = -1;
                            continue;
                        }

                        f[kk12] = -1;
                        n[3] = -1;
                    }

                    if(f[kk21]!=-1)
                    {
                        f[kk22] = -1;
                        shori = 1;
                        continue;
                    }

                    f[kk21] = 0;
                    n[5] = 0;
                    xx = 0;

                    for(k=1; k<8; k=k+2)
                    {
                        if((!n[k])&&(n[k+1]||n[k+2]))
                        {
                            xx++;
                        }
                    }

                    if(xx == 1)
                    {
                        f[kk21] = -1;
                        f[kk22] = -1;
                        shori =1;
                    }
                    else
                        f[kk21] = -1;
                }
            }
        }while(shori);

        free(g);
    }

     

    /////////////////////////////////////////////////////////////////////////
    //Pavlidis细化算法

    //功能:对图象进行细化
    //参数:image:代表图象的一维数组
    //      lx:图象宽度
    //      ly:图象高度
    //      无返回值
    void ThinnerPavlidis(void *image, unsigned long lx, unsigned long ly)
    {
        char erase, n[8];
        char *f;
        unsigned char bdr1,bdr2,bdr4,bdr5;
        short c,k,b;
        unsigned long i,j;
        long kk,kk1,kk2,kk3;
        f = (char*)image;

        for(i=1; i<lx-1; i++)
        {
            for(j=1; j<ly-1; j++)
            {
                kk = i*ly + j;
                if(f[kk])
                    f[kk] = 1;
            }
        }

        for(i=0, kk1=0, kk2=ly-1; i<lx; i++, kk1+=ly, kk2+=ly)
        {
            f[kk1]=0;
            f[kk2]=0;
        }

        for(j=0, kk=(lx-1)*ly; j<ly; j++,kk++)
        {
            f[j]=0;
            f[kk]=0;
        }

        c=5;
        erase =1;
        while(erase)
        {
            c++;
            for(i=1; i<lx-1; i++)
            {
                for(j=1; j<ly-1; j++)
                {
                    kk=i*ly+j;
                    if(f[kk]!=1)
                        continue;

                    kk1 = kk-ly -1;
                    kk2 = kk1 + 1;
                    kk3 = kk2 + 1;
                    n[3] = f[kk1];
                    n[2] = f[kk2];
                    n[1] = f[kk3];
                    kk1 = kk - 1;
                    kk3 = kk + 1;
                    n[4] = f[kk1];
                    n[0] = f[kk3];
                    kk1 = kk + ly -1;
                    kk2 = kk1 + 1;
                    kk3 = kk2 + 1;
                    n[5] = f[kk1];
                    n[6] = f[kk2];
                    n[7] = f[kk3];

                    bdr1 =0;
                    for(k=0; k<8; k++)
                    {
                        if(n[k]>=1)
                            bdr1|=0x80>>k;
                    }

                    if((bdr1&0252)== 0252)
                        continue;
                    f[kk] = 2;
                    b=0;

                    for(k=0; k<=7; k++)
                    {
                        b+=bdr1&(0x80>>k);
                    }

                    if(b<=1)
                        f[kk]=3;

                    if((bdr1&0160)!=0&&(bdr1&07)!=0&&(bdr1&0210)==0)
                        f[kk]=3;
                    else if((bdr1&&0301)!=0&&(bdr1&034)!=0&&(bdr1&042)==0)
                        f[kk]=3;
                    else if((bdr1&0202)==0 && (bdr1&01)!=0)
                        f[kk]=3;
                    else if((bdr1&0240)==0 && (bdr1&0100)!=0)
                        f[kk]=3;
                    else if((bdr1&050)==0 && (bdr1&020)!=0)
                        f[kk]=3;
                    else if((bdr1&012)==0 && (bdr1&04)!=0)
                        f[kk]=3;
                }
            }

            for(i=1; i<lx-1; i++)
            {
                for(j=1; j<ly-1; j++)
                {
                    kk = i*ly + j;
                    if(!f[kk])
                        continue;

                    kk1 = kk - ly -1;
                    kk2 = kk1 + 1;
                    kk3 = kk2 + 1;
                    n[3] = f[kk1];
                    n[2] = f[kk2];
                    n[1] = f[kk3];
                    kk1 = kk - 1;
                    kk2 = kk + 1;
                    n[4] = f[kk1];
                    n[0] = f[kk3];
                    kk1 = kk + ly -1;
                    kk2 = kk1 + 1;
                    kk3 = kk2 + 1;
                    n[5] = f[kk1];
                    n[6] = f[kk2];
                    n[7] = f[kk3];
                    bdr1 = bdr2 =0;

                    for(k=0; k<=7; k++)
                    {
                        if(n[k]>=1)
                            bdr1|=0x80>>k;
                        if(n[k]>=2)
                            bdr2|=0x80>>k;
                    }

                    if(bdr1==bdr2)
                    {
                        f[kk] = 4;
                        continue;
                    }

                    if(f[kk]!=2)
                        continue;

                    if((bdr2&0200)!=0 && (bdr1&010)==0 &&
                        ((bdr1&0100)!=0 &&(bdr1&001)!=0 ||
                        ((bdr1&0100)!=0 ||(bdr1 & 001)!=0) &&
                        (bdr1&060)!=0 &&(bdr1&06)!=0))
                    {
                        f[kk] = 4;
                    }

                    else if((bdr2&040)!=0 && (bdr1&02)==0 &&
                        ((bdr1&020)!=0 && (bdr1&0100)!=0 ||
                        ((bdr1&020)!=0 || (bdr1&0100)!=0) &&
                        (bdr1&014)!=0 && (bdr1&0201)!=0))
                    {
                        f[kk] = 4;
                    }

                    else if((bdr2&010)!=0 && (bdr1&0200)==0 &&
                        ((bdr1&04)!=0 && (bdr1&020)!=0 ||
                        ((bdr1&04)!=0 || (bdr1&020)!=0) &&
                        (bdr1&03)!=0 && (bdr1&0140)!=0))
                    {
                        f[kk] = 4;
                    }

                    else if((bdr2&02)!=0 && (bdr1&040)==0 &&
                        ((bdr1&01)!=0 && (bdr1&04)!=0 ||
                        ((bdr1&01)!=0 || (bdr1&04)!=0) &&
                        (bdr1&0300)!=0 && (bdr1&030)!=0))
                    {
                        f[kk] = 4;
                    }
                }
            }

            for(i=1; i<lx-1; i++)
            {
                for(j=1; j<ly-1; j++)
                {
                    kk = i*ly + j;
                    if(f[kk]!=2)
                        continue;
                    kk1 = kk - ly -1;
                    kk2 = kk1 + 1;
                    kk3 = kk2 + 1;
                    n[3] = f[kk1];
                    n[2] = f[kk2];
                    n[1] = f[kk3];
                    kk1 = kk - 1;
                    kk2 = kk + 1;
                    n[4] = f[kk1];
                    n[0] = f[kk3];
                    kk1 = kk + ly -1;
                    kk2 = kk1 + 1;
                    kk3 = kk2 + 1;
                    n[5] = f[kk1];
                    n[6] = f[kk2];
                    n[7] = f[kk3];
                    bdr4 = bdr5 =0;
                    for(k=0; k<=7; k++)
                    {
                        if(n[k]>=4)
                            bdr4|=0x80>>k;
                        if(n[k]>=5)
                            bdr5|=0x80>>k;
                    }
                    if((bdr4&010) == 0)
                    {
                        f[kk] = 5;
                        continue;
                    }
                    if((bdr4&040) == 0 && bdr5 ==0)
                    {
                        f[kk] = 5;
                        continue;
                    }
                    if(f[kk]==3||f[kk]==4)
                        f[kk] = c;
                }
            }

            erase = 0;
            for(i=1; i<lx-1; i++)
            {
                for(j=1; j<ly-1; j++)
                {
                    kk = i*ly +j;
                    if(f[kk]==2||f[kk] == 5)
                    {
                        erase = 1;
                        f[kk] = 0;
                    }
                }
            }
        }
    }

     

    /////////////////////////////////////////////////////////////////////////
    //Rosenfeld细化算法

    //功能:对图象进行细化
    //参数:image:代表图象的一维数组
    //      lx:图象宽度
    //      ly:图象高度
    //      无返回值
    void ThinnerRosenfeld(void *image, unsigned long lx, unsigned long ly)
    {
        char *f, *g;
        char n[10];
        char a[5] = {0, -1, 1, 0, 0};
        char b[5] = {0, 0, 0, 1, -1};
        char nrnd, cond, n48, n26, n24, n46, n68, n82, n123, n345, n567, n781;
        short k, shori;
        unsigned long i, j;
        long ii, jj, kk, kk1, kk2, kk3, size;
        size = (long)lx * (long)ly;

        g = (char *)malloc(size);
        if(g==NULL)
        {
            printf("error in alocating mmeory!\n");
            return;
        }

        f = (char *)image;
        for(kk=0l; kk<size; kk++)
        {
            g[kk] = f[kk];
        }

        do
        {
            shori = 0;
            for(k=1; k<=4; k++)
            {
                for(i=1; i<lx-1; i++)
                {
                    ii = i + a[k];

                    for(j=1; j<ly-1; j++)
                    {
                        kk = i*ly + j;

                        if(!f[kk])
                            continue;

                        jj = j + b[k];
                        kk1 = ii*ly + jj;

                        if(f[kk1])
                            continue;

                        kk1 = kk - ly -1;
                        kk2 = kk1 + 1;
                        kk3 = kk2 + 1;
                        n[3] = f[kk1];
                        n[2] = f[kk2];
                        n[1] = f[kk3];
                        kk1 = kk - 1;
                        kk3 = kk + 1;
                        n[4] = f[kk1];
                        n[8] = f[kk3];
                        kk1 = kk + ly - 1;
                        kk2 = kk1 + 1;
                        kk3 = kk2 + 1;
                        n[5] = f[kk1];
                        n[6] = f[kk2];
                        n[7] = f[kk3];

                        nrnd = n[1] + n[2] + n[3] + n[4]
                            +n[5] + n[6] + n[7] + n[8];
                        if(nrnd<=1)
                            continue;

                        cond = 0;
                        n48 = n[4] + n[8];
                        n26 = n[2] + n[6];
                        n24 = n[2] + n[4];
                        n46 = n[4] + n[6];
                        n68 = n[6] + n[8];
                        n82 = n[8] + n[2];
                        n123 = n[1] + n[2] + n[3];
                        n345 = n[3] + n[4] + n[5];
                        n567 = n[5] + n[6] + n[7];
                        n781 = n[7] + n[8] + n[1];

                        if(n[2]==1 && n48==0 && n567>0)
                        {
                            if(!cond)
                                continue;
                            g[kk] = 0;
                            shori = 1;
                            continue;
                        }

                        if(n[6]==1 && n48==0 && n123>0)
                        {
                            if(!cond)
                                continue;
                            g[kk] = 0;
                            shori = 1;
                            continue;
                        }

                        if(n[8]==1 && n26==0 && n345>0)
                        {
                            if(!cond)
                                continue;
                            g[kk] = 0;
                            shori = 1;
                            continue;
                        }

                        if(n[4]==1 && n26==0 && n781>0)
                        {
                            if(!cond)
                                continue;
                            g[kk] = 0;
                            shori = 1;
                            continue;
                        }

                        if(n[5]==1 && n46==0)
                        {
                            if(!cond)
                                continue;
                            g[kk] = 0;
                            shori = 1;
                            continue;
                        }

                        if(n[7]==1 && n68==0)
                        {
                            if(!cond)
                                continue;
                            g[kk] = 0;
                            shori = 1;
                            continue;
                        }

                        if(n[1]==1 && n82==0)
                        {
                            if(!cond)
                                continue;
                            g[kk] = 0;
                            shori = 1;
                            continue;
                        }

                        if(n[3]==1 && n24==0)
                        {
                            if(!cond)
                                continue;
                            g[kk] = 0;
                            shori = 1;
                            continue;
                        }

                        cond = 1;
                        if(!cond)
                            continue;
                        g[kk] = 0;
                        shori = 1;
                    }
                }

                for(i=0; i<lx; i++)
                {
                    for(j=0; j<ly; j++)
                    {
                        kk = i*ly + j;
                        f[kk] = g[kk];
                    }
                }
            }
        }while(shori);

        free(g);
    }                    

     

    /////////////////////////////////////////////////////////////////////////
    //基于索引表的细化细化算法

    //功能:对图象进行细化
    //参数:lpDIBBits:代表图象的一维数组
    //      lWidth:图象高度
    //      lHeight:图象宽度
    //      无返回值
    BOOL WINAPI ThiningDIBSkeleton (LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
    {    
        //循环变量
        long i;
        long j;
        long lLength;
        
        unsigned char deletemark[256] = {
            0,0,0,0,0,0,0,1,    0,0,1,1,0,0,1,1,
            0,0,0,0,0,0,0,0,    0,0,1,1,1,0,1,1,
            0,0,0,0,0,0,0,0,    1,0,0,0,1,0,1,1,
            0,0,0,0,0,0,0,0,    1,0,1,1,1,0,1,1,
            0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,
            0,0,0,0,0,0,0,0,    1,0,0,0,1,0,1,1,
            1,0,0,0,0,0,0,0,    1,0,1,1,1,0,1,1,
            0,0,1,1,0,0,1,1,    0,0,0,1,0,0,1,1,
            0,0,0,0,0,0,0,0,    0,0,0,1,0,0,1,1,
            1,1,0,1,0,0,0,1,    0,0,0,0,0,0,0,0,
            1,1,0,1,0,0,0,1,    1,1,0,0,1,0,0,0,
            0,1,1,1,0,0,1,1,    0,0,0,1,0,0,1,1,
            0,0,0,0,0,0,0,0,    0,0,0,0,0,1,1,1,
            1,1,1,1,0,0,1,1,    1,1,0,0,1,1,0,0,
            1,1,1,1,0,0,1,1,    1,1,0,0,1,1,0,0
        };//索引表

        unsigned char p0, p1, p2, p3, p4, p5, p6, p7;
        unsigned char *pmid, *pmidtemp;
        unsigned char sum;
        int changed;
        bool bStart = true;
        lLength = lWidth * lHeight;
        unsigned char *pTemp = (unsigned char *)malloc(sizeof(unsigned char) * lWidth * lHeight);
        
        //    P0 P1 P2
        //    P7    P3
        //    P6 P5 P4

        while(bStart)
        {
            bStart = false;
            changed = 0;

            //首先求边缘点(并行)
            pmid = (unsigned char *)lpDIBBits + lWidth + 1;
            memset(pTemp, (BYTE) 0, lLength);
            pmidtemp = (unsigned char *)pTemp + lWidth + 1;
            for(i = 1; i < lHeight -1; i++)
            {
                for(j = 1; j < lWidth - 1; j++)
                {
                    if( *pmid == 0)
                    {
                        pmid++;
                        pmidtemp++;
                        continue;
                    }

                    p3 = *(pmid + 1);
                    p2 = *(pmid + 1 - lWidth);
                    p1 = *(pmid - lWidth);
                    p0 = *(pmid - lWidth -1);
                    p7 = *(pmid - 1);
                    p6 = *(pmid + lWidth - 1);
                    p5 = *(pmid + lWidth);
                    p4 = *(pmid + lWidth + 1);
                    
                    sum = p0 & p1 & p2 & p3 & p4 & p5 & p6 & p7;
                    if(sum == 0)
                    {
                        *pmidtemp = 1;
                    }

                    pmid++;
                    pmidtemp++;
                }
                pmid++;
                pmid++;
                pmidtemp++;
                pmidtemp++;
            }
            
            //现在开始串行删除
            pmid = (unsigned char *)lpDIBBits + lWidth + 1;
            pmidtemp = (unsigned char *)pTemp + lWidth + 1;

            for(i = 1; i < lHeight -1; i++)
            {
                for(j = 1; j < lWidth - 1; j++)
                {
                    if( *pmidtemp == 0)
                    {
                        pmid++;
                        pmidtemp++;
                        continue;
                    }

                    p3 = *(pmid + 1);
                    p2 = *(pmid + 1 - lWidth);
                    p1 = *(pmid - lWidth);
                    p0 = *(pmid - lWidth -1);
                    p7 = *(pmid - 1);
                    p6 = *(pmid + lWidth - 1);
                    p5 = *(pmid + lWidth);
                    p4 = *(pmid + lWidth + 1);
                    
                    p1 *= 2;
                    p2 *= 4;
                    p3 *= 8;
                    p4 *= 16;
                    p5 *= 32;
                    p6 *= 64;
                    p7 *= 128;

                    sum = p0 | p1 | p2 | p3 | p4 | p5 | p6 | p7;
                    if(deletemark[sum] == 1)
                    {
                        *pmid = 0;
                        bStart = true;
                    }

                    pmid++;
                    pmidtemp++;
                }

                pmid++;
                pmid++;
                pmidtemp++;
                pmidtemp++;
            }
        }

        return true;
    }

    发表于 @ 2006年02月27日 09:17:00|评论(loading...)|编辑

    新一篇: 图象的骨架提取算法 | 旧一篇: 字符的生成

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © byxdaz