using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Diagnostics;
using System.Drawing.Imaging;//窗体调用private Bitmap RotateImage(Bitmap bmp, double angle){Graphics g = null;Bitmap tmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppRgb);tmp.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);g = Graphics.FromImage(tmp);try{g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);g.RotateTransform((float)angle);g.DrawImage(bmp, 0, 0);}finally{g.Dispose();}return tmp;}private void button1_Click(object sender, EventArgs e){string fnIn = "f:\\test\\image0097_4.tif";string fnOut = "f:\\test\\output.tif";Bitmap bmpIn = new Bitmap(fnIn);gmseDeskew sk = new gmseDeskew(bmpIn);double skewangle = sk.GetSkewAngle();Bitmap bmpOut = RotateImage(bmpIn, -skewangle);bmpOut.Save(fnOut, ImageFormat.Tiff);//此处简单保存,可采用压缩方式保存
                   }#region 算法处理类public class gmseDeskew{public class HougLine{// Count of points in the line.public int Count;// Index in Matrix.public int Index;// The line is represented as all x,y that solve y*cos(alpha)-x*sin(alpha)=d public double Alpha;public double d;}Bitmap cBmp;double cAlphaStart = -20;double cAlphaStep = 0.2;int cSteps = 40 * 5;double[] cSinA;double[] cCosA;double cDMin;double cDStep = 1;int cDCount;// Count of points that fit in a line.int[] cHMatrix;public double GetSkewAngle(){gmseDeskew.HougLine[] hl = null;int i = 0;double sum = 0;int count = 0;// Hough Transformation
Calc();// Top 20 of the detected lines in the image.hl = GetTop(20);// Average angle of the linesfor (i = 0; i <= 19; i++){sum += hl[i].Alpha;count += 1;}return sum / count;}private HougLine[] GetTop(int Count){HougLine[] hl = null;int i = 0;int j = 0;HougLine tmp = null;int AlphaIndex = 0;int dIndex = 0;hl = new HougLine[Count + 1];for (i = 0; i <= Count - 1; i++){hl[i] = new HougLine();}for (i = 0; i <= cHMatrix.Length - 1; i++){if (cHMatrix[i] > hl[Count - 1].Count){hl[Count - 1].Count = cHMatrix[i];hl[Count - 1].Index = i;j = Count - 1;while (j > 0 && hl[j].Count > hl[j - 1].Count){tmp = hl[j];hl[j] = hl[j - 1];hl[j - 1] = tmp; j -= 1;}}}for (i = 0; i <= Count - 1; i++){dIndex = hl[i].Index / cSteps;AlphaIndex = hl[i].Index - dIndex * cSteps;hl[i].Alpha = GetAlpha(AlphaIndex);hl[i].d = dIndex + cDMin;}return hl;}public gmseDeskew(Bitmap bmp){cBmp = bmp;}private void Calc(){int x = 0;int y = 0;int hMin = cBmp.Height / 4;int hMax = cBmp.Height * 3 / 4;Init();for (y = hMin; y <= hMax; y++){for (x = 1; x <= cBmp.Width - 2; x++){    // Only lower edges are considered.if (IsBlack(x, y)){if (!IsBlack(x, y + 1)){Calc(x, y);}}}}}private void Calc(int x, int y){int alpha = 0;double d = 0;int dIndex = 0;int Index = 0;for (alpha = 0; alpha <= cSteps - 1; alpha++){d = y * cCosA[alpha] - x * cSinA[alpha];dIndex = (int)CalcDIndex(d);Index = dIndex * cSteps + alpha;try{cHMatrix[Index] += 1;}catch (Exception ex){Debug.WriteLine(ex.ToString());}}}private double CalcDIndex(double d){return Convert.ToInt32(d - cDMin);}private bool IsBlack(int x, int y){Color c = default(Color);double luminance = 0;c = cBmp.GetPixel(x, y);luminance = (c.R * 0.299) + (c.G * 0.587) + (c.B * 0.114);return luminance < 140;}private void Init(){int i = 0;double angle = 0;// Precalculation of sin and cos. cSinA = new double[cSteps];cCosA = new double[cSteps];for (i = 0; i <= cSteps - 1; i++){angle = GetAlpha(i) * Math.PI / 180.0;cSinA[i] = Math.Sin(angle);cCosA[i] = Math.Cos(angle);}  // Range of d: cDMin = -cBmp.Width;cDCount = (int)(2 * (cBmp.Width + cBmp.Height) / cDStep);cHMatrix = new int[cDCount * cSteps + 1];}public double GetAlpha(int Index){return cAlphaStart + Index * cAlphaStep;}}#endregion

具体算法为:由左边界开始扫描,从开始发现黑色素到黑色素达到平均值,在这个距离内的长度和版心的高度通过直角三角形的函数进行换算,这样就知道了倾斜的角度。

转载于:https://www.cnblogs.com/longyi/p/4635014.html

C#实现bitmap图像矫正相关推荐

  1. Android 自定义View Canvas —— Bitmap

    Bitmap 绘制图片 常用的方法有一下几种 (1) drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint ...

  2. BitMap 内存使用优化

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  3. 第52章,bitmap图像处理(从零开始学android),第52章、Bitmap图像处理(从零开始学Android)...

    1.Drawable → Bitmap public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitma ...

  4. GDI+ Bitmap与WPF BitmapImage的相互转换

    原文:GDI+ Bitmap与WPF BitmapImage的相互转换 using System.Windows.Interop; //... // Convert BitmapImage to Bi ...

  5. Android 中一些常用类的常用方法(Math、Random、Color、Paint、Canvas、Bitmap、BitmapFactory)...

    1.java.lang.Math类常用的常量和方法: Math.PI 记录的圆周率 Math.E 记录e的常量 Math.abs 求绝对值 Math.sin 正弦函数 Math.asin 反正弦函数 ...

  6. C#图片灰度处理(位深度24→位深度8),用灰度数组byte[]新建一个8位灰度图像Bitmap 。...

    原文:C#图片灰度处理(位深度24→位深度8) #region 灰度处理/// <summary>/// 将源图像灰度化,并转化为8位灰度图像./// </summary>// ...

  7. R.drawable 转 bitmap

    引用:http://zhidao.baidu.com/question/291703800.html Bitmap bmp=BitmapFactory.decodeResource(r, R.draw ...

  8. B-tree索引与Bitmap索引的对比测试

    昨天发现一条语句没有走索引,检查发现表没有建相应索引,先建立B-tree索引,测试发现是全表扫描,检查表数据发现此字段的值只有2个,删除原索引又建立bitmap索引,发现还是全表扫描,再次检查数据发现 ...

  9. Bitmap上下合成图片

    合成两张图片,上下叠加的效果: /*** 把两个位图覆盖合成为一个位图,以底层位图的长宽为基准** @param backBitmap 在底部的位图* @param frontBitmap 盖在上面的 ...

最新文章

  1. LeetCode——Rotate Image(二维数组顺时针旋转90度)
  2. ITK:概念检查是同维的
  3. html标题怎么分开,html – 如何使用angularjs将标签标题与其主体分开?
  4. 无需格式转换直接发布DWG图纸到Autodesk Infrastructure Map Server(AIMS) 2013
  5. php版redis插件,SSDB数据库,增强型的Redis管理api实例
  6. Python工作笔记-解决python使用nohup后台运行重定向不输出问题
  7. 安卓手机安装并使用自动化应用Tasker
  8. 【渝粤题库】陕西师范大学200561 英语写作(一) 作业
  9. 机器学习笔记(四):kNN算法 | 凌云时刻
  10. aforge java_C#:视频与图像抓取(二)AForge.NET + WPF | 春小麦
  11. 电子计算机x射线断层扫描,CT——电子计算机X射线断层扫描技术.pdf
  12. pfv和php,【Retina China 2019】工欲善其事必先利其器——影像学在眼底病中的应用与发展...
  13. Jmeter性能测试报告导出
  14. 划水总结剑指offer 链表系列1
  15. 如何输出一个某种编码的字符串?
  16. 微信头像失效_微信头像地址失效踩坑记附带解决方案
  17. ACAC java中final关键字
  18. 在Linux中重启Tomcat服务器
  19. 集成友盟的意见反馈功能
  20. 多线程案例----严格单例模式----和尚吃馒头问题

热门文章

  1. mstsc 加密oracle修正,mstsc远程报:这可能是由于CredSSP 加密Oracle修正的两种完美解决方法...
  2. 带通 带阻滤波器 幅频响应_二阶有源带通滤波器设计
  3. JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑
  4. 全国计算机二级qq闪退,电脑上QQ闪退怎么回事?各个系统版本电脑QQ闪退现象的解决方法介绍...
  5. python算两个点的距离公式_计算Python Numpy向量之间的欧氏距离实例
  6. 科技论文中的分析与综合-如何写好科技论文之我见(七)
  7. 哪些人不适合去做科研(转)
  8. hdu5492(2015合肥网络赛I题)
  9. python selenium webdriver_Python:selenium.webdriver问题(服务器上没有X)
  10. linux 脚本 查找替换,Shell脚本学习指南之查找与替换介绍