| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2214 人关注过本帖, 1 人收藏
标题:【转帖】VFP实现验证码去噪二值化算法
取消只看楼主 加入收藏
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
结帖率:96.55%
收藏(1)
已结贴  问题点数:20 回复次数:8 
【转帖】VFP实现验证码去噪二值化算法
网上看到一段vfp代码,可以将验证码图片的背景去掉,得到验证码字符。可用于车牌自动识别,但是可惜我把代码重新打了一遍,并没有成功,不知道原因,哪位大侠可以看看哪里出了问题???
附文章出处: https://www.
程序代码:
declare integer GdipSaveImageToStream in gdiplus.dll;
    long nlmage,;
    integer stream,;
    string csidEncoder,;
    long encoderparams
declare integer GdipCreateBitmapFromScan0 in gdiplus.dll; 
    integer nwidth,;
    integer nheight,;
    integer nstride,;
    integer npixelformat,;
    string @cscan0,;
    integer @nlmage
declare integer GdipGetImageHeight in gdiplus.dll;
    integer img,;
    integer @imgheight
declare integer GdipGetImageWidth in gdiplus.dll;
    integer img,;
    integer @imagewidth
declare integer GdipDrawImageRect in gdiplus.dll;
    integer ngraphics,;
    integer nImage,;
    single,;
    single,;
    single,;
    single
declare integer GdipGetImageGraphicsContext in gdiplus.dll;
    integer nImage,;
    integer @ngraphics
declare integer GdipLoadImageFromFile in gdiplus.dll;
    string wfilename,;
    integer @nImage
declare integer GdipDeleteGraphics in gdiplus.dll;
    integer graphics
declare long GdipDisposeImage in gdiplus.dll;
    long image
declare long CreateStreamOnHGlobal in ole32.dll;
    long hGlobal,;
    long fDeleteOnRelease,;
    long @ppstm && 创建字符流指针
declare integer GetProcessHeap in win32api
declare integer HeapAlloc in win32api long, long, long 
declare integer HeapFree in win32api integer,integer,integer
declare integer ReleaseStgMedium in ole32.dll string pmedium

store 0 to nimage, lnheight,lnwidth,newbitmap,ngraphics
clsidEncoder=0h00F47C55041AD3119A730000f81EF32E &&BMP
picfile=getpict()
GdipLoadImageFromFile(strconv(picfile+chr(0),5),@nimage)
GdipGetImageHeight(nimage,@lnheight)&&获得图像高度
GdipGetImageWidth(nimage,@lnwidth) &&获取图像宽度
pixelformat_32bppaRGB=0x0026200A
GdipCreateBitmapFromScan0(lnwidth,lnheight,0,pixelformat_32bppaRGB,0,@newbitmap)
GdipGetImageGraphicsContext(newbitmap,@ngraphics)
GdipDrawImageRect(ngraphics,nimage,0,0,lnwidth,lnheight)
GdipDisposeImage(nimage) &&此时nimage已没用,销毁
streamsize=lnheight*lnwidth*4+54 &&计算内存大小
&& 申请内存
hprocheap=GetProcessHeap()
Ihmemptr=HeapAlloc(hprocheap,0,streamsize) &&申请
IHStream=0
CreateStreamOnHGlobal(Ihmemptr,1,@IHStream) &&创建字符流指针
GdipSaveImageToStream(newbitmap,IHStream,@clsidEncoder,0)
Ihmemptr=Ihmemptr+54 &&像素开始地址
mR=0
mG=0
mB=0
RUM=10 &&二值化颜色容差
for i=0 to streamsize-54 step 4 &&统计平均颜色
    B=asc(sys(2600,Ihmemptr+i,1))
    G=asc(sys(2600,Ihmemptr+i+1,1))
    R=asc(sys(2600,Ihmemptr+i+2,1))
    mR=mR+R
    mG=mG+G
    mB=mB+B
endfor
mRGB=int((mR+mG+mB)/(lnheight*lnwidth*3)) &&自动二值化阀值
if mRGB<128 &&二值化阀值调节
    mRGB=mRGB+RUM
endif
NUM=mRGB &&自动对比度阀值
for i=0 to lnwidth-1
    for ii=0 to lnheight-1
        Ihmemptrtmp=Ihmemptr+(ii*lnwidth+i)*4 &&第i,ii点像素的地址
        B=asc(sys(2600,Ihmemptr+i,1))
        G=asc(sys(2600,Ihmemptr+i+1,1))
        R=asc(sys(2600,Ihmemptr+i+2,1))
        if int((R+G+B)/3)>mRGB
            sys(Ihmemptrtmp,4,0hFFFFFF00)
        endif
        if (R+G+B)/3>128
            uR=(255-R)/255
            uG=(255-G)/255
            uB=(255-B)/255
            R2=R+NUM*uR
            G2=G+NUM*uG
            B2=B+NUM*uB
            R=icase(R2>255,255,R2<0,0,R2)
            G=icase(G2>255,255,G2<0,0,G2)
            B=icase(B2>255,255,B2<0,0,B2)
        else
            R2=R-NUM
            G2=G-NUM
            B2=B-NUM
            R=icase(R2>255,255,R2<0,0,R2)
            G=icase(G2>255,255,G2<0,0,G2)
            B=icase(B2>255,255,B2<0,0,B2)
        endif
        if int((R+G+B)/3)>mRGB
            sys(Ihmemptrtmp,4,0hFFFFFF00)
        else
            sys(Ihmemptrtmp,3,0hFFFFFF00)
        endif
    endfor
endfor
strtofile(sys(2600,Ihmemptr-54,streamsize),"6.bmp") &&保存到本地
HeapFree(hprocheap,0,Ihmemptr)
ReleaseStgMedium(0h04000000+bintoc(Ihmemptr,"4rs")+0h00000000)
GdipDisposeImage(newbitmap)
GdipDeleteGraphics(ngraphics)


附上验证码测试图片
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 验证码 二值化 integer long dll 
2022-10-01 23:03
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 3楼 schtg
就是没有成功才发帖求助。
2022-10-07 18:11
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 11楼 nbwww
需要密码
2022-10-07 18:16
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 5楼 吹水佬
可以的,真厉害,到底是斑竹。。。
2022-10-07 18:17
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 10楼 nbwww
不降噪估计不行,不然就不会有降噪需求
2022-10-07 18:19
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 7楼 mywisdom88
https://www. 你可以参考这篇文章。
2022-10-07 18:25
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
记得2005年的时候,那时候有关图片的技术非常少,API编程几乎一窍不通,网速又慢,很难搜索到有用的信息。那时找了bmp文件格式的技术文档,研究了很久,另辟蹊径,从文件格式入手,进行图片的灰度化,以及黑白化。可惜时间太久了,已经找不到当初的源代码了,只依稀记得大概方法。。。
2022-10-07 22:13
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
昨天发现电脑的看图王,居然有图文识别功能,这个验证码图片,居然没有去噪也能识别。。。
2022-10-08 08:20
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:750
专家分:1114
注 册:2021-10-13
收藏
得分:0 
回复 27楼 nbwww
报毒。。。
2022-10-09 11:54
快速回复:【转帖】VFP实现验证码去噪二值化算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024149 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved