/// <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;
        }

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; 

文章標籤

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

新版本在這

http://dark99.pixnet.net/blog/post/42926225

 

 

這次更新了版本

有增加留言區塊 

 

至於是否能自動留言 

目前基本上是要使用者 

在愛情公寓 有vip 

功能才比較能達成

 

如果有任何使用上問題歡迎留言

或者 email   ==> changjeimin@gmail.com

 

 

 

  Login.jpg  

文章標籤

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

  • 這是一篇加密文章,請輸入密碼
  • 密碼提示:電話
  • 請輸入密碼: