/// <summary>
        
/// 得到灰度图像前景背景的临界值 最大类间方差法,yuanbao,2007.08
        
/// </summary>
        
/// <returns>前景背景的临界值</returns>
        public int GetDgGrayValue()
        {
            
int[] pixelNum = new int[256];           //图象直方图,共256个点
            int n, n1, n2;
            
int total;                              //total为总和,累计值
            double m1, m2, sum, csum, fmax, sb;     //sb为类间方差,fmax存储最大方差值
            int k, t, q;
            
int threshValue = 1;                      // 阈值
            int step = 1;
            
//生成直方图
            for (int i =0; i < bmpobj.Width ; i++)
            {
                
for (int j = 0; j < bmpobj.Height; j++)
                {
                    
//返回各个点的颜色,以RGB表示
                    pixelNum[bmpobj.GetPixel(i,j).R]++;            //相应的直方图加1
                }
            }
            
//直方图平滑化
            for (k = 0; k <= 255; k++)
            {
                total 
= 0;
                
for (t = -2; t <= 2; t++)              //与附近2个灰度做平滑化,t值应取较小的值
                {
                    q 
= k + t;
                    
if (q < 0)                     //越界处理
                        q = 0;
                    
if (q > 255)
                        q 
= 255;
                    total 
= total + pixelNum[q];    //total为总和,累计值
                }
                pixelNum[k] 
= (int)((float)total / 5.0 + 0.5);    //平滑化,左边2个+中间1个+右边2个灰度,共5个,所以总和除以5,后面加0.5是用修正值
            }
            
//求阈值
            sum = csum = 0.0;
            n 
= 0;
            
//计算总的图象的点数和质量矩,为后面的计算做准备
            for (k = 0; k <= 255; k++)
            {
                sum 
+= (double)k * (double)pixelNum[k];     //x*f(x)质量矩,也就是每个灰度的值乘以其点数(归一化后为概率),sum为其总和
                n += pixelNum[k];                       //n为图象总的点数,归一化后就是累积概率
            }
            fmax 
= -1.0;                          //类间方差sb不可能为负,所以fmax初始值为-1不影响计算的进行
            n1 = 0;
            
for (k = 0; k < 256; k++)                  //对每个灰度(从0到255)计算一次分割后的类间方差sb
            {
                n1 
+= pixelNum[k];                //n1为在当前阈值遍前景图象的点数
                if (n1 == 0) { continue; }            //没有分出前景后景
                n2 = n - n1;                        //n2为背景图象的点数
                if (n2 == 0) { break; }               //n2为0表示全部都是后景图象,与n1=0情况类似,之后的遍历不可能使前景点数增加,所以此时可以退出循环
                csum += (double)k * pixelNum[k];    //前景的“灰度的值*其点数”的总和
                m1 = csum / n1;                     //m1为前景的平均灰度
                m2 = (sum - csum) / n2;               //m2为背景的平均灰度
                sb = (double)n1 * (double)n2 * (m1 - m2) * (m1 - m2);   //sb为类间方差
                if (sb > fmax)                  //如果算出的类间方差大于前一次算出的类间方差
                {
                    fmax 
= sb;                    //fmax始终为最大类间方差(otsu)
                    threshValue = k;              //取最大类间方差时对应的灰度的k就是最佳阈值
                }
            }
            
return threshValue;
        }

 2、如何去除干扰点/干扰线
    2.1 干扰点/干扰线的特征分析
    现在网上的大多数的验证码都是加了干扰的,一般分为干扰点和干扰线,如下图。标用1、2、3的分别为点、线、字符。

dark99 發表在 痞客邦 留言(0) 人氣()

最近写了几个网站的验证码图片自动识别程序,尽管每个网站的验证码图片都不相同,识别的方法有所差别。但写得多了,也总结出不少相同之处。今天抽空封装出一个基础类来,发现可以很好地重复利用,编写不同的验证码识别程序,效率提高了不少。好东东不能独享,现放出来供大家共同研究,请网友们妥善用之。 

封装后的类使用很简单,针对不同的验证码,相应继承修改某些方法,即可简单几句代码就可以实现图片识别了: 



GrayByPixels(); //灰度处理

GetPicValidByValue(128, 4); //得到有效空间

Bitmap[] pics = GetSplitPics(4, 1); //分割

string code = GetSingleBmpCode(pics[i], 128); //得到代码串


dark99 發表在 痞客邦 留言(0) 人氣()


C#實現通過程序自動抓取遠程Web網頁信息的代碼
發布:dxy 字體:[增加 減小] 類型:轉載
通過程序自動的讀取其它網站網頁顯示的信息,類似於爬蟲程序。比方說我們有一個系統,要提取BaiDu網站上歌曲搜索排名。分析系統在根據得到的數據進行數據分析。為業務提供參考數據。 
  為了完成以上的需求,我們就需要模擬瀏覽器瀏覽網頁,得到頁面的數據在進行分析,最後把分析的結構,即整理好的數據寫入數據庫。那麽我們的思路就是: 
  1、發送HttpRequest請求。 
  2、接收HttpResponse返回的結果。得到特定頁面的html源文件。 
  3、取出包含數據的那一部分源碼。 
  4、根據html源碼生成HtmlDocument,循環取出數據。 
  5、寫入數據庫。 
程序如下:   
//根據Url地址得到網頁的html源碼 
private string GetWebContent(string Url) 

string strResult=""; 
try 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); 
    //聲明一個HttpWebRequest請求 
request.Timeout = 30000; 
//設置連接超時時間 
request.Headers.Set("Pragma", "no-cache"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream streamReceive = response.GetResponseStream(); 
Encoding encoding = Encoding.GetEncoding("GB2312"); 
StreamReader streamReader = new StreamReader(streamReceive, encoding); 
strResult = streamReader.ReadToEnd(); 

catch 

MessageBox.Show("出錯"); 

return strResult; 

為了使用HttpWebRequest和HttpWebResponse,需填名字空間引用 
  using System.Net; 

以下是程序具體實現過程: 
private void button1_Click(object sender, EventArgs e) 

//要抓取的URL地址 
string Url = "http://list.mp3.baidu.com/topso/mp3topsong.html?id=1#top2"; 
//得到指定Url的源碼 
   string strWebContent = GetWebContent(Url); 
richTextBox1.Text = strWebContent; 
    //取出和數據有關的那段源碼 
int iBodyStart = strWebContent.IndexOf("<body", 0); 
int iStart = strWebContent.IndexOf("歌曲TOP500", iBodyStart); 
int iTableStart = strWebContent.IndexOf("<table", iStart); 
int iTableEnd = strWebContent.IndexOf("</table>", iTableStart); 
string strWeb = strWebContent.Substring(iTableStart, iTableEnd - iTableStart + 8); 
//生成HtmlDocument 
   WebBrowser webb = new WebBrowser(); 
webb.Navigate("about:blank"); 
HtmlDocument htmldoc = webb.Document.OpenNew(true); 
htmldoc.Write(strWeb); 
HtmlElementCollection htmlTR = htmldoc.GetElementsByTagName("TR"); 
foreach (HtmlElement tr in htmlTR) 

string strID = tr.GetElementsByTagName("TD")[0].InnerText; 
string strName = SplitName(tr.GetElementsByTagName("TD")[1].InnerText, "MusicName"); 
string strSinger = SplitName(tr.GetElementsByTagName("TD")[1].InnerText, "Singer"); 
strID = strID.Replace(".", ""); 
//插入DataTable 
AddLine(strID, strName, strSinger,"0"); 
string strID1 = tr.GetElementsByTagName("TD")[2].InnerText; 
string strName1 = SplitName(tr.GetElementsByTagName("TD")[3].InnerText, "MusicName"); 
string strSinger1 = SplitName(tr.GetElementsByTagName("TD")[3].InnerText, "Singer"); 
//插入DataTable 
strID1 = strID1.Replace(".", ""); 
AddLine(strID1, strName1, strSinger1,"0"); 
string strID2 = tr.GetElementsByTagName("TD")[4].InnerText; 
string strName2 = SplitName(tr.GetElementsByTagName("TD")[5].InnerText, "MusicName"); 
string strSinger2 = SplitName(tr.GetElementsByTagName("TD")[5].InnerText, "Singer"); 
//插入DataTable 
strID2 = strID2.Replace(".", ""); 
AddLine(strID2, strName2, strSinger2,"0"); 

//插入數據庫 
InsertData(dt); 
    
dataGridView1.DataSource = dt.DefaultView; 

dark99 發表在 痞客邦 留言(0) 人氣()

Login.jpg
新版本在這
http://dark99.pixnet.net/blog/post/42926225
 
 

dark99 發表在 痞客邦 留言(1) 人氣()

這篇文章受密碼保護,請輸入密碼後查看內容。

dark99 發表在 痞客邦 留言(0) 人氣()

2011-10-17 22 59 11.jpg
這只是很純粹 讀取顯示而已並沒有什麼特殊功能
檔案範例在下面
如果有需要 存檔請在跟我說
 

dark99 發表在 痞客邦 留言(0) 人氣()

2011-10-17 22 06 46.jpg

  Sub ListV_ADD2(ByVal MyLen As Int16)
    ListView1.View = View.Details
    ListView1.GridLines = True
    ListView1.Columns.Clear()
    For a1 = 0 To MyLen - 1
      ListView1.Columns.Add("111", 100, HorizontalAlignment.Left)
    Next
    'ListView1.Columns.Add("列 2", 50, HorizontalAlignment.Left)
    'ListView1.Columns.Add("列 3", 50, HorizontalAlignment.Left)
    'ListView1.Columns.Add("列 4", 50, HorizontalAlignment.Center)
    ListView1.Refresh()
  End Sub


'初始化
  Dim Mylist As ListViewItem = New ListViewItem

dark99 發表在 痞客邦 留言(0) 人氣()

資料來源
http://itgroup.blueshop.com.tw/cwvdavid/pg?n=convew&i=247135
Public Function ConnectUrl_andGetText(ByVal MyUrl As String) As String
'連到指定網頁, 並將文字內容抓回來顯示...
'HttpUtility.UrlEncode("")
Dim MyHtmlData As String = ""
Dim myRequest As System.Net.WebRequest 'Request
Dim myResponse As System.Net.WebResponse 'Response
Dim myStream As System.IO.StreamReader '利用StreamReader讀取資料
Dim ContentLength As Long = 0
Dim LocalFile As System.IO.FileStream
Try
myRequest = System.Net.WebRequest.Create(MyUrl)
myResponse = myRequest.GetResponse()
ContentLength = myResponse.ContentLength
'ContentLength = -1
If ContentLength >= 0 Then
'(以UTF8來讀取)
myStream = New System.IO.StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8)
'資料讀取到字串變數中...直接整個讀取
'(遇到網路不穩時容易出問題)
'(遇到ContentLength未知時, 一定出問題...)
MyHtmlData = myStream.ReadToEnd()
Else
'如果ContentLength小於0, 就必須另外處理,
'看是要先下載, 另存成文字檔, 再讀取
'或是其他方式...
Dim Buffer As Byte() = New Byte(2047) {}
Dim 暫存位置 As String = Environment.GetEnvironmentVariable("temp") & "\SFCS_TempUrlFile.Text"
Dim BytesRead As Long
LocalFile = New IO.FileStream(暫存位置, IO.FileMode.Create) 'Create the local file
Do
BytesRead = myResponse.GetResponseStream().Read(Buffer, 0, 2048)
LocalFile.Write(Buffer, 0, BytesRead)
Loop Until BytesRead = 0
LocalFile.Flush()
LocalFile.Close()
myStream = New System.IO.StreamReader(暫存位置, System.Text.Encoding.UTF8)
MyHtmlData = myStream.ReadToEnd
End If
Catch ex As Exception
MyHtmlData = "Url讀取錯誤:" & MyUrl & " " & ex.Message
End Try
'關閉FileStream
If Not LocalFile Is Nothing Then
LocalFile.Close()
End If
'關閉StreamReader
If Not myStream Is Nothing Then
myStream.Close()
End If
'關閉連線
If Not myResponse Is Nothing Then
myResponse.Close()
End If
Return MyHtmlData '這是要回傳的內容...
End Function

dark99 發表在 痞客邦 留言(0) 人氣()

原始碼片段 如下

<input type="checkbox" name="safe" id="safe" value="1">我已詳細閱讀
  <input type="submit" name="button" id="button" value="我已詳細閱讀">
 程式碼寫法 vb.net

dark99 發表在 痞客邦 留言(0) 人氣()

GuerrillaMail 免費的臨時電子郵件信箱,限時 60 分鐘、可延長、支援中文信件
http://www.guerrillamail.com/zh/
 
十分鐘電子郵件

dark99 發表在 痞客邦 留言(0) 人氣()

2011-09-18 20 37 43.png

這個是 當期 簡單文字版
 裡面還是靠webbrowser去寫的 
 只是為了方便抓 html元素
 如果用 httpwebrequest httpwebresponse 我還不知道怎麼把它丟進去 htmlelement 類別內

dark99 發表在 痞客邦 留言(0) 人氣()

先加入 參考 
Microsoft.mshtml.dll (或者 mshtml.tlb)
 
範例 :網頁原始碼大約如下

dark99 發表在 痞客邦 留言(0) 人氣()

Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。