需求:扫描的文本图像由于人为因素,使用不能实现文本居中(内用区域靠边),影像图像美观;

解决思路:识别出本文区域,重新绘制到原图中心即可。

实现方案如下:

实现文本图像版型居中分六步:

第一:CvInvoke.CvtColor图像灰度化;

第二:CvInvoke.Threshold图像二值化;

第三:CvInvoke.FindContours边缘检测;

第四:遍历检测结果,使用CvInvoke.BoundingRectangle获取所有矩形区域;

第五:遍历所有得到的矩形区域确定文字区域;

第六:根据文字区域计算位置,根据新位置重新绘制图像。

private void button6_Click(object sender, EventArgs e){//Dim imgCanny As Image(Of Gray, Byte) = New Image(Of Gray, Byte)(img.Width, img.Height, bkGrayWhite)Bitmap graybtm;Bitmap bitmap =new Bitmap(pictureBox2.Image);List<Rectangle> rects;Rectangle rect;Point a =  new Point(0, 0);Point b = new Point(0, 0);imageBox1.Image = FindBundingBox(bitmap, out graybtm, out rects);//Image<Bgr, Byte> imageResult = pictureBox2.Image.CopyBlank();Image<Bgr, byte> imageResult = new Image<Bgr, byte>(graybtm);int i = 0;foreach (Rectangle triangle in rects){if (i == 0){a.X = triangle.X;a.Y = triangle.Y;}i++;a.X = Math.Min(a.X, triangle.X);a.Y = Math.Min(a.Y, triangle.Y);b.X = Math.Max(b.X, triangle.X + triangle.Width);b.Y = Math.Max(b.Y, triangle.Y + triangle.Height);}rect = new Rectangle(a.X,a.Y, b.X-a.X,b.Y-a.Y);Pen mypen = new Pen(Color.Black, 1);//设置画笔的颜色及宽度//imageResult.Draw(rect, new Bgr(Color.LightSteelBlue), 2);Bitmap imageResult_s = new Bitmap(pictureBox2.Image);Graphics g = Graphics.FromImage(imageResult_s);g.Clear(Color.White);g.DrawImage(pictureBox2.Image, new Rectangle(pictureBox2.Image.Width / 2 - rect.Width / 2, rect.Y, rect.Width, rect.Height), rect, GraphicsUnit.Pixel);g.DrawRectangle(new Pen(Color.Red, 2), rect);g.Dispose(); //ppp();pictureBox2.Image = imageResult_s;}

获取区域:

private Bitmap FindBundingBox(Bitmap bitmap, out Bitmap graybtm, out List<Rectangle> rects){Image<Bgr, byte> img = new Image<Bgr, byte>(bitmap);Image<Gray, byte> gray = new Image<Gray, byte>(img.Width, img.Height);Image<Bgr, byte> resuImage = new Image<Bgr, byte>(img.Width, img.Height);Image<Gray, byte> dnc = new Image<Gray, byte>(img.Width, img.Height);CvInvoke.CvtColor(img, gray, ColorConversion.Bgra2Gray);//灰度化//做一下膨胀,x与y方向都做,但系数不同var kernal = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(4, 4), new Point(1, 1));CvInvoke.Erode(gray, gray, kernal, new Point(0, 2), 1, BorderType.Default, new MCvScalar());//CvInvoke.Canny(gray, gray, 100, 60);CvInvoke.Threshold(gray, gray, 100, 255, ThresholdType.BinaryInv | ThresholdType.Otsu);//二值化//检测连通域,每一个连通域以一系列的点表示,FindContours方法只能得到第一个域graybtm = gray.ToBitmap();VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();CvInvoke.FindContours(gray, contours, dnc, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);var color = new MCvScalar(0, 0, 255);Console.WriteLine(contours.Size);rects = new List<Rectangle>();//开始遍历for (int i = 0; i < contours.Size; i++){//得到这个连通区域的外接矩形var rect = CvInvoke.BoundingRectangle(contours[i]);//如果高度不足,或者长宽比太小,认为是无效数据,否则把矩形画到原图上if (rect.Height > 2 && rect.Width > 2){rects.Add(rect);CvInvoke.DrawContours(resuImage, contours, i, color);}}return img.ConcateVertical(resuImage).ToBitmap();}

参考:http://www.cnblogs.com/daxiongblog/p/5776636.html

emgu 图像处理-版型居中相关推荐

  1. 如何正确做出固定宽度且居中的版型

    如何正確實作出固定寬度且置中的版型 2005-04-16 以往,網頁開發者都會碰到這樣的問題:有時候他們會在網頁上擺放一些圖層 (像是滑鼠移過去就會出現的下拉式選單) ,但這些圖層的位置都是絕對的 ( ...

  2. 天翼云对象存储Java对接(经典版 Ⅱ型)

    前言: 1.此教程只针对 经典版 Ⅱ型 2.前两天甲方让用天翼云做对象存储,我一脸懵逼,根本没听过这玩意,之前就用过阿里云,和华为云,而且喵的他们的接口文档一点用都没有,后来我给他们客服打电话,他们安 ...

  3. 计算机主板包括哪四种版型,硬件百科:版型不同的主板有什么区别?

    我们都知道,随着移动化的发展,一些中小主机越来越受人们的欢迎,主机的大小是由机箱的大小决定的,而机箱的大小又受着主板大小的影响,作为攒机中最容易忽视缺缺最重要的硬件,主板的发挥一定程度上影响着着其他硬 ...

  4. 《大象:thinking in uml 》(第二版) 3章 UML核心元素 1-2节 版型、参与者

    只供参考,喜欢请支持正版图书 3.1 版型 在UML里有一个概念叫版型(stereotype),有些书里也称为类型.构造型.这个概念是对一个UML元素基础定义的扩展,在同一个元素基础定义的基础上赋予特 ...

  5. 我学UML建模系列之核心元素 -------- 版型(类型)

    版类概念 UML中几乎每一个元模型都有一个版型.例如:用例有 "业务用例","业务用例实现"等版型,类有"接口"."边界类&quo ...

  6. allegro 05_A PCB电路板版型创建、定位孔调用步骤

    首先打开PCB文件,指向存储工程目录 然后设置绘图格式 然后调用 "Add / Line "  ; class /subclass 选择 "Board Geometry ...

  7. omnigraffle 创建版型

    创建其他版型: 1 从iconfont下载 svg 2 新建版型, 拖入svg ,选中所有部件,右击"群组",即可得到一个图形 可以把多个图形放到一个版型中 版型是矢量图,可以更改 ...

  8. 片袖原型制图_版型 | 八种袖子原型的制版画法

    原标题:版型 | 八种袖子原型的制版画法 想要更多服装类资料教程,加入服装微学院社群 (此处已添加圈子卡片,请到今日头条客户端查看) 一.日本传统文化式原型配袖 规格:袖长=53 cm 袖肘线长=袖长 ...

  9. 【Python】打包压缩软件,命名软件名为软件的版型、遥控等信息

    源代码: # -*- coding: utf-8 -*- #coding=utf-8'''打包软件脚本 脚本说明:打包后压缩文件的命名为(版型.屏参.遥控名.版本号.编译时间等信息) 注意事项:执行脚 ...

最新文章

  1. IDEA的CPU占用率高问题解决方法
  2. 【c语言】蓝桥杯算法提高 3-2字符串输入输出函数
  3. undo表空间文件丢失恢复(4)--无备份无recover的情况下恢复
  4. Spring AOP本质(7)
  5. jquery 毫秒转换成日期_jQuery Datepicker – 如何将日期格式化为纪元时间戳(以秒为单位,而不是毫秒)...
  6. redis-sentinel 主从复制高可用
  7. 自然语言理解——introduction
  8. aws terraform_在AWS第1部分中使用Terraform自动缩放组:基本步骤
  9. Linux PWN从入门到熟练
  10. Linux下mail/mailx命令发送邮件
  11. “Error:(1, 1) java: 非法字符: '\ufeff'”错误解决办法
  12. Python二维数组,坑苦了
  13. mc服务器小地图不显示玩家,为啥小地图莫名消失了 玩家:或许是它喝完随机饮料后 自己隐身了...
  14. 微信分享第三方网页链接自定义标题、描述、图片
  15. java实验——设计圆柱体类和圆锥体类,继承圆类Circle并实现Volume接口,计算体积。
  16. ESP32的倒腾日记——做一个蓝牙双模快捷键盘
  17. python作中国地图背景气泡图_Python数据可视化:香港地图、房价可视化,绘制气泡图...
  18. kafka broker 进入 conflicted ephemeral node 死循环
  19. H5学习之路之audio音频播放
  20. ADCLK905调试

热门文章

  1. 利用Disqus快速搭建评论系统
  2. 整数转罗马数字罗马数字转整数
  3. threejs 特效 简单 火焰
  4. C语言自动类型转换和强制类型转换详解,C语言强制类型转换 - 地狱的烈火的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. Ps 初学者教程「55」如何准确选择图像区域?
  6. python win32 EnumWindows
  7. js第三节-自定义属性、索引值
  8. ABB定位器提供灵活且经济高效的阀门自动化解决
  9. 开发餐饮点菜PDA设备记录一
  10. Waffle Nano初相识