亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#文檔圖片自動糾偏

2019-11-17 03:17:53
字體:
來源:轉載
供稿:網友

C#文檔圖片自動糾偏

最近找到一個不錯的文檔圖片自動糾偏跟大家分享一下。

糾偏算法:

  1 public class Deskew  2     {  3         // RePResentation of a line in the image.    4         private class HougLine  5         {  6             // Count of points in the line.  7             public int Count;  8             // Index in Matrix.  9             public int Index; 10             // The line is represented as all x,y that solve y*cos(alpha)-x*sin(alpha)=d 11             public double Alpha; 12         } 13  14  15         // The Bitmap 16         public Bitmap _internalBmp; 17  18         // The range of angles to search for lines 19         const double ALPHA_START = -20; 20         const double ALPHA_STEP = 0.2; 21         const int STEPS = 40 * 5; 22         const double STEP = 1; 23  24         // Precalculation of sin and cos. 25         double[] _sinA; 26         double[] _cosA; 27  28         // Range of d 29         double _min; 30  31  32         int _count; 33         // Count of points that fit in a line. 34         int[] _hMatrix; 35  36         // Calculate the skew angle of the image cBmp. 37         public double GetSkewAngle() 38         { 39             // Hough Transformation 40             Calc(); 41  42             // Top 20 of the detected lines in the image. 43             HougLine[] hl = GetTop(20); 44  45             // Average angle of the lines 46             double sum = 0; 47             int count = 0; 48             for (int i = 0; i <= 19; i++) 49             { 50                 sum += hl[i].Alpha; 51                 count += 1; 52             } 53             return sum / count; 54         } 55  56         // Calculate the Count lines in the image with most points. 57         private HougLine[] GetTop(int count) 58         { 59             HougLine[] hl = new HougLine[count]; 60  61             for (int i = 0; i <= count - 1; i++) 62             { 63                 hl[i] = new HougLine(); 64             } 65             for (int i = 0; i <= _hMatrix.Length - 1; i++) 66             { 67                 if (_hMatrix[i] > hl[count - 1].Count) 68                 { 69                     hl[count - 1].Count = _hMatrix[i]; 70                     hl[count - 1].Index = i; 71                     int j = count - 1; 72                     while (j > 0 && hl[j].Count > hl[j - 1].Count) 73                     { 74                         HougLine tmp = hl[j]; 75                         hl[j] = hl[j - 1]; 76                         hl[j - 1] = tmp; 77                         j -= 1; 78                     } 79                 } 80             } 81  82             for (int i = 0; i <= count - 1; i++) 83             { 84                 int dIndex = hl[i].Index / STEPS; 85                 int alphaIndex = hl[i].Index - dIndex * STEPS; 86                 hl[i].Alpha = GetAlpha(alphaIndex); 87                 //hl[i].D = dIndex + _min; 88             } 89  90             return hl; 91         } 92  93  94         // Hough Transforamtion: 95         private void Calc() 96         { 97             int hMin = _internalBmp.Height / 4; 98             int hMax = _internalBmp.Height * 3 / 4; 99 100             Init();101             for (int y = hMin; y <= hMax; y++)102             {103                 for (int x = 1; x <= _internalBmp.Width - 2; x++)104                 {105                     // Only lower edges are considered.106                     if (IsBlack(x, y))107                     {108                         if (!IsBlack(x, y + 1))109                         {110                             Calc(x, y);111                         }112                     }113                 }114             }115         }116 117         // Calculate all lines through the point (x,y).118         private void Calc(int x, int y)119         {120             int alpha;121 122             for (alpha = 0; alpha <= STEPS - 1; alpha++)123             {124                 double d = y * _cosA[alpha] - x * _sinA[alpha];125                 int calculatedIndex = (int)CalcDIndex(d);126                 int index = calculatedIndex * STEPS + alpha;127                 try128                 {129                     _hMatrix[index] += 1;130                 }131                 catch (Exception ex)132                 {133                     System.Diagnostics.Debug.WriteLine(ex.ToString());134                 }135             }136         }137         private double CalcDIndex(double d)138         {139             return Convert.ToInt32(d - _min);140         }141         private bool IsBlack(int x, int y)142         {143             Color c = _internalBmp.GetPixel(x, y);144             double luminance = (c.R * 0.299) + (c.G * 0.587) + (c.B * 0.114);145             return luminance < 140;146         }147 148         private void Init()149         {150             // Precalculation of sin and cos.151             _cosA = new double[STEPS];152             _sinA = new double[STEPS];153 154             for (int i = 0; i < STEPS; i++)155             {156                 double angle = GetAlpha(i) * Math.PI / 180.0;157                 _sinA[i] = Math.Sin(angle);158                 _cosA[i] = Math.Cos(angle);159             }160 161             // Range of d:            162             _min = -_internalBmp.Width;163             _count = (int)(2 * (_internalBmp.Width + _internalBmp.Height) / STEP);164             _hMatrix = new int[_count * STEPS];165 166         }167 168         private static double GetAlpha(int index)169         {170             return ALPHA_START + index * ALPHA_STEP;171         }172     }
View Code

自己寫的調用方法

  1         public static void DeskewImage(string fileName, byte binarizeThreshold)  2         {  3             //打開圖像  4             Bitmap bmp = OpenImage(fileName);  5   6             Deskew deskew = new Deskew();  7             Bitmap tempBmp = CropImage(bmp, bmp.Width / 4, bmp.Height / 4, bmp.Width / 2, bmp.Height / 2);  8             deskew._internalBmp = BinarizeImage(tempBmp, binarizeThreshold);  9             double angle = deskew.GetSkewAngle(); 10             bmp = RotateImage(bmp, (float)(-angle)); 11  12             //保存圖像(需要再還原圖片原本的位深度) 13             SaveImage(bmp, fileName); 14         } 15  16         /// <summary> 17         /// 圖像剪切 18         /// </summary> 19         /// <param name="bmp"></param> 20         /// <param name="StartX"></param> 21         /// <param name="StartY"></param> 22         /// <param name="w"></param> 23         /// <param name="h"></param> 24         /// <returns></returns> 25         private static Bitmap CropImage(Bitmap bmp, int StartX, int StartY, int w, int h) 26         { 27             try 28             { 29                 Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format32bppArgb); 30  31                 Graphics g = Graphics.FromImage(bmpOut); 32                 g.DrawImage(bmp, new Rectangle(0, 0, w, h), new Rectangle(StartX, StartY, w, h), GraphicsUnit.Pixel); 33                 g.Dispose(); 34  35                 return bmpOut; 36             } 37             catch 38             { 39                 return null; 40             } 41         } 42  43  44         /// <summary> 45         /// 圖像二值化 46         /// </s
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲国产天美传媒修理工| 在线看片第一页欧美| www国产亚洲精品久久网站| 在线观看视频99| 国产视频观看一区| 欧美精品情趣视频| 亚洲免费视频网站| 日韩av免费在线看| 91精品国产91久久久久久不卡| 成人免费网站在线观看| 在线日韩第一页| 国产在线视频一区| 亚洲国产精品免费| 欧美黑人一级爽快片淫片高清| 亚洲人午夜精品免费| 亚洲欧美日韩中文在线| 久久免费成人精品视频| 欧美成人一二三| 久久久电影免费观看完整版| 亚洲精品自产拍| www.日韩.com| 久久国产精品久久精品| 国产日韩在线看| 国产精品一区二区久久久久| 日韩在线视频线视频免费网站| 成人欧美一区二区三区在线湿哒哒| 亚洲色图35p| 中文国产亚洲喷潮| 久久视频中文字幕| 欧美精品激情在线| 国产精品一区二区久久久久| 欧美激情免费看| 亚洲高清久久网| 中文欧美在线视频| 国产精品久久久久久搜索| 日韩高清av一区二区三区| 国产日韩欧美自拍| 中文字幕日韩精品有码视频| 欧美精品激情blacked18| 亚洲综合中文字幕在线观看| 久久久久久久影视| 一区二区欧美亚洲| 亚洲欧美一区二区三区在线| 亚洲电影免费观看高清完整版| 日韩精品在线电影| 日韩av中文字幕在线播放| 欧美日韩国产一区在线| 久久视频在线播放| 精品免费在线观看| 综合激情国产一区| 成人看片人aa| 国产精品久久久久久久久久ktv| 亚洲丝袜一区在线| 欧美成人免费va影院高清| 国产69久久精品成人看| 97精品在线视频| 理论片在线不卡免费观看| 91在线免费视频| 在线观看视频亚洲| 成人av在线网址| 国产综合视频在线观看| 国产亚洲欧美日韩美女| 成人黄色片网站| 欧美肥臀大乳一区二区免费视频| 精品自在线视频| 热99在线视频| 亚洲已满18点击进入在线看片| 亚洲成人av片在线观看| 亚洲国产中文字幕在线观看| 日韩男女性生活视频| 国产精品精品国产| 欧美中文字幕在线视频| 国产精品视频播放| 国产精品久久久久影院日本| 国产69精品久久久久99| 亚洲午夜小视频| 精品久久久久久久久国产字幕| 亚洲天堂av高清| 日韩中文字幕国产| 另类视频在线观看| 国产a级全部精品| 欧美麻豆久久久久久中文| 欧美激情一区二区三区在线视频观看| 欧美在线视频免费观看| 日韩免费在线观看视频| 亚洲国产精品久久精品怡红院| 国产精品海角社区在线观看| 久久精品国产96久久久香蕉| 欧美成人性色生活仑片| 国产福利精品在线| 久久精品国产久精国产思思| 亚洲网站视频福利| 亚洲男人天堂2023| 夜夜嗨av色一区二区不卡| 免费av一区二区| 亚洲国产精品成人va在线观看| 中文字幕欧美视频在线| 亚洲视频在线观看| 久久精品99久久香蕉国产色戒| 久久国内精品一国内精品| 亚洲欧洲一区二区三区久久| 亚洲偷欧美偷国内偷| 精品久久久久久| 欧美丰满片xxx777| 欧美激情中文字幕在线| 九九久久国产精品| 久久久久久久91| 亚洲国产日韩欧美在线图片| 国产午夜精品全部视频在线播放| 久久激情五月丁香伊人| 亚洲视频一区二区| 美女啪啪无遮挡免费久久网站| 久久精品国产视频| 国产精品日本精品| 久久精品色欧美aⅴ一区二区| 95av在线视频| 伊人久久免费视频| 亚洲色图狂野欧美| 久久精品2019中文字幕| 91精品国产91久久久久久吃药| 伊人激情综合网| 国产精品第3页| 中文字幕亚洲一区| 欧美日韩免费区域视频在线观看| 国产一区二区三区高清在线观看| 欧美肥老妇视频| 性欧美激情精品| 精品中文字幕久久久久久| 亚洲精品动漫100p| 成人a级免费视频| 亚洲最大福利视频| 北条麻妃在线一区二区| 6080yy精品一区二区三区| 清纯唯美亚洲综合| www.日韩不卡电影av| 欧美成人网在线| 91精品国产综合久久香蕉的用户体验| 4k岛国日韩精品**专区| 国产成人久久久| 亚洲国产精品久久久久秋霞不卡| 亚洲美女在线观看| xxxxx91麻豆| 久久国产一区二区三区| 精品呦交小u女在线| 色先锋资源久久综合5566| 国产精品99久久99久久久二8| 国产精品v片在线观看不卡| 欧美刺激性大交免费视频| 一区二区三区美女xx视频| 97精品国产97久久久久久春色| 欧美日韩激情小视频| 亚洲一品av免费观看| 精品视频偷偷看在线观看| 国产精品亚洲一区二区三区| 亚洲国产精品网站| 久久精品91久久久久久再现| 亚洲第一视频网站| 欧美激情va永久在线播放| 精品久久久久久国产91| 欧美区二区三区| 日韩欧美在线观看| 日韩av片永久免费网站| 亚洲第一二三四五区| 久久国产精品首页|