找回密码
 加入
搜索
查看: 8971|回复: 7

[效率算法] 关于验证码识别中去除噪声的讨论

  [复制链接]
发表于 2013-1-30 22:54:22 | 显示全部楼层 |阅读模式
悬赏500金钱未解决
本帖最后由 tryhi 于 2013-2-3 12:43 编辑


注:图中的软件是用了疯子前辈的软件http://www.autoitx.com/forum.php?mod=viewthread&tid=32094
由于没学过验证码识别,所以提出的问题可能有点弱
图中红色、绿色的点是要去除的,目前我只想到了红色点的去除,关于绿色点没有比较好的方案,红色的思路是这样的,搜索该点周围8个点,如果空白,则去除,如果周围只有1个点,则搜索这一个的周围8个点,发现它也只有一个,就两个都去除,这样就能实现去除红色点的效果,代码如下,可能效率、思路、代码都不是很好,关于三点相连或者抱团的点,应该怎么去除比较好?R的右腿那里有个很浅的红色圆圈那里三个点是不用去除的,怕有人误除,特指出来。
年底比较忙,可能跟帖速度会很慢,大家见谅


#include <Array.au3>
$string = "                                                                      0                          "&@CRLF& _
"                  0 00                                                                           "&@CRLF& _
"                                       00                     0       0          0               "&@CRLF& _
"   0                                    0                              0              0      0   "&@CRLF& _
"                     0                         000                                0              "&@CRLF& _
"                                  0                                              0               "&@CRLF& _
"          0                      0                                      0                        "&@CRLF& _
"                                0                  0                   00                        "&@CRLF& _
"                                                   0                                   0         "&@CRLF& _
"     00       00         0                                                                0      "&@CRLF& _
"       00000000          0                                                            0          "&@CRLF& _
"         00              0               0     0                                    0000000      "&@CRLF& _
"         00                                               0                0     00000    000    "&@CRLF& _
"         00                        0                                               00       00 0 "&@CRLF& _
"         00                  0                                                      00       00  "&@CRLF& _
"    0   00                   000000000                        0                    00       00   "&@CRLF& _
"0       00     0              00    000                0000000000                  00        00  "&@CRLF& _
"        00             0      00     000             000       0       0           00        000 "&@CRLF& _
"        00                    00      00              00  0     0              0   00   0    00  "&@CRLF& _
"       00                     00 0    00              00   0                       00        00  "&@CRLF& _
"       00           0         00      000   0         00                           00         00 "&@CRLF& _
"       00              0      00     00               00  0  0                     000        00 "&@CRLF& _
"       00                     00    0000 0            00     0   0                  00        00 "&@CRLF& _
" 0     00                     0000000      0          00     00                     00        00 "&@CRLF& _
"       00                     00  00           0   0   00000000   0   0             00  0     00 "&@CRLF& _
"        00          0      0  000   00                  00    00     0               00        00"&@CRLF& _
"        00                     00   00                  000    0                     00        0 "&@CRLF& _
"        00                     00 0  00                 00     0                     00       00 "&@CRLF& _
"        00                     00  0000                 00                           00       0  "&@CRLF& _
"       00                      00    0000               00                         0  00     00  "&@CRLF& _
"       00                      00     00                00                        0   00   000   "&@CRLF& _
"   00  00                      00     00             0   00                      0   0000000     "&@CRLF& _
"     00000000          0      0000     000               00                         000          "&@CRLF& _
"                             00           0               000         0                       0  "&@CRLF& _
"                  0                        0        0    00           0   0                      "&@CRLF

Local $array_s[35][97]
$hang = StringRegExp($string,'\V+',3)
For $i = 0 To 34
        $lie = StringSplit($hang[$i],'',2)
        For $j = 0 To 96
                $array_s[$i][$j] = $lie[$j]
        Next
Next
_quchuzaodian($array_s)
_ArrayDisplay($array_s,'去除噪声之后')



Func _quchuzaodian(ByRef $array)
        $35 = UBound($array, 1) - 1
        $97 = UBound($array, 2) - 1
        For $i = 0 To $35
                For $j = 0 To $97
                        If $array[$i][$j] = "0" Then
                                $sizhou = _sizhou($array, $i, $j)
                                If $sizhou[0] = 0 Then $array[$i][$j] = " "
                                If $sizhou[0] = 1 Then
                                        $sizhou2 = _sizhou($array, $sizhou[1], $sizhou[2])
                                        If $sizhou2[0] = 1 Then
                                                $array[$i][$j] = " "
                                                $array[$sizhou[1]][$sizhou[2]] = " "
                                        EndIf
                                EndIf
                        EndIf
                Next
        Next
EndFunc   ;==>_quchuzaodian

Func _sizhou($array, $1, $2, $front = '0')
        If Not IsArray($array) Then Return SetError(1)
        Local $temp = 0, $a = UBound($array, 1) - 1, $b = UBound($array, 2) - 1
        Local $temp[3] = [0]
        If $1 > 0 And $2 > 0 Then
                If $array[$1 - 1][$2 - 1] = $front Then $temp = _sizhou_udf($temp, $1, $2, 1)
        EndIf
        If $1 > 0 Then
                If $array[$1 - 1][$2 + 0] = $front Then $temp = _sizhou_udf($temp, $1, $2, 2)
        EndIf
        If $1 > 0 And $2 < $b Then
                If $array[$1 - 1][$2 + 1] = $front Then $temp = _sizhou_udf($temp, $1, $2, 3)
        EndIf
        If $2 < $b Then
                If $array[$1 + 0][$2 + 1] = $front Then $temp = _sizhou_udf($temp, $1, $2, 4)
        EndIf
        If $1 < $a And $2 < $b Then
                If $array[$1 + 1][$2 + 1] = $front Then $temp = _sizhou_udf($temp, $1, $2, 5)
        EndIf
        If $1 < $a Then
                If $array[$1 + 1][$2 + 0] = $front Then $temp = _sizhou_udf($temp, $1, $2, 6)
        EndIf
        If $1 < $a And $2 > 0 Then
                If $array[$1 + 1][$2 - 1] = $front Then $temp = _sizhou_udf($temp, $1, $2, 7)
        EndIf
        If $2 > 0 Then
                If $array[$1 + 0][$2 - 1] = $front Then $temp = _sizhou_udf($temp, $1, $2, 8)
        EndIf
        Return $temp
EndFunc   ;==>_sizhou

Func _sizhou_udf($array,$1,$2,$i)
        Switch $i
                Case 1
                        $array[1] = $1-1
                        $array[2] = $2-1
                Case 2
                        $array[1] = $1-1
                        $array[2] = $2+0
                Case 3
                        $array[1] =$1-1
                        $array[2] = $2+1
                Case 4
                        $array[1] = $1+0
                        $array[2] = $2+1
                Case 5 
                        $array[1] = $1+1
                        $array[2] = $2+1
                Case 6
                        $array[1] = $1+1
                        $array[2] = $2+0
                Case 7
                        $array[1] = $1+1
                        $array[2] = $2-1
                Case 8
                        $array[1] = $1+0
                        $array[2] = $2-1
        EndSwitch
        $array[0] += 1
        Return $array
EndFunc

附件: 您需要 登录 才可以下载或查看,没有账号?加入
发表于 2013-1-31 10:22:26 | 显示全部楼层
厉害哈,,表示关注

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10

查看全部评分

发表于 2013-1-31 12:56:17 | 显示全部楼层
不错不错,很牛啊!

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10

查看全部评分

 楼主| 发表于 2013-2-2 00:45:13 | 显示全部楼层
有没人提出可行的思路
发表于 2013-2-3 07:00:51 | 显示全部楼层
我觉得不要管红点绿点,取灰点就行了,
搜索到一个灰点,并将其周围8个点中是灰点的位置记录下来,再分别分析这8个点的周围的点(已分析过的点要略过),将灰点提取出来.....
总之,英文字符点阵肯定是连续的,所以这种方法肯定可行

另外,我想知道楼主提取出灰点后,怎样将点阵识别成字?

评分

参与人数 1金钱 +15 收起 理由
tryhi + 15 我说的红跟绿不是你理解的那样。。。

查看全部评分

发表于 2013-2-3 07:14:35 | 显示全部楼层
噢,不能识别颜色啊?不过看起来噪点跟字符没有粘连,所以还是可行的,只是注意每个点如果标记为已搜索就不要再搜索,否则可能就死循环了

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10

查看全部评分

发表于 2013-2-3 07:18:20 | 显示全部楼层
搜索踫到边界或全是空白时就停下,并且每个点只搜索一次,这样应该不会死循环
 楼主| 发表于 2013-2-3 12:49:31 | 显示全部楼层
回复 7# unique009

回复 6# unique009

回复 5# unique009


听起来好像没有什么可行性。。。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-5 11:21 , Processed in 0.092551 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表