方法一:直接寻找表格边框的倾斜角

如果表格中的水平边框能够很好经过预处理得到,那么通过定位这一边框。得到边框的起始点和斜率,就能得到相应的角度。通过角度就能够实现校正。

难点在于如何得到边框的起始点。起始点的特点是起点的行坐标最小,终点的列坐标最小。

方法二:采用熟悉的hough变换

倾斜校正前处理和后处理都是一致,区别在于怎么得到倾斜的角度,而倾斜的角度是通过倾斜的直线得到。关键就在于检测直线的方法。hough变换检测直线的原理其他地方有详细的介绍,这里结合matlab的函数做一个梳理。这里要用的三个函数是hough,houghpeaks,houghlines。

图像经hough后得到的是一个参数空间的矩阵,矩阵的每一个值是对应坐标处累加器的值,参数空间的划分在得到的另外两个向量theta,rho中体现。

在得到hough变换的矩阵后,houghpeaks就来检测矩阵中符合要求有可能是直线的参数点,当然阈值和检测的个数是可以自己设定的。这时得到的是峰值的横纵坐标。

得到峰值后就要确定每个峰值所确定的线段,houghlines就是用来完成这一工作的。houghlines返回的是关于一个线段的所有信息-两个点的横纵坐标和的值。

后续的工作就是遍历所有线段并显示出来,找到其中最长的一条。用这一条确定斜率,由斜率得到角度,然后进行旋转就可。

方法三:radon变换

Radon 变换检测倾斜角度的原理是:对倾斜的表格图像在一定的倾斜角度(0:179)范围内进行,然后查找使投影最大的那个角度。记录这一角度,就能够得到倾斜的角度。

%hough变换倾斜校正:
clc;
clear all;
[fn pn fi]=uigetfile('*.*','choose apicture');
Img=imread([pn fn]);
% Img=imrotate(Img,5,'bilinear');I =rgb2gray(Img);
figure;imhist(I);
bw = ~improve_hist(I);
figure;
imshow(bw);BW=bw;
str=strel('line',20,0);
BW=imerode(BW,str);
str=strel('line',80,0);
BW=imdilate(BW,str);
% BW=edge(BW,'canny');
figure;
imshow(BW);title('canny 边界图像');
[H,T,R]=hough(BW);
figure,imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');
xlabel('\theta'),ylabel('\rho');
axis on, axis normal,hold on;
P=houghpeaks(H,4,'threshold',ceil(0.3*max(H(:))));
x=T(P(:,2)); y = R(P(:,1));
plot(x,y,'s','color','white');
lines=houghlines(BW,T,R,P,'FillGap',50,'MinLength',7);
figure,imshow(BW),title('直线标识图像');
max_len = 0;
hold on;
for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];%标出线段plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');%[260,1;348,142]的第一列x值,第二列y值。绿色画出直线%标出线段的起始和终端点plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');%线段的起点--黄色plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');%线段的终点--红色len=norm(lines(k).point1-lines(k).point2);%计算矩阵的范数。Len(k)=len;if (len>max_len)max_len=len;xy_long=xy;end
end
% 强调最长的部分
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','blue');%最长的线段--蓝色。
[L1 Index1]=max(Len(:));
% 最长线段的起始和终止点
x1=[lines(Index1).point1(1)lines(Index1).point2(1)];
y1=[lines(Index1).point1(2)lines(Index1).point2(2)];
% 求得线段的斜率
K1=-(lines(Index1).point1(2)-lines(Index1).point2(2))/...(lines(Index1).point1(1)-lines(Index1).point2(1))
angle=atan(K1)*180/pi
A = imrotate(I,-angle,'bilinear','loose');%imrate 是逆时针的所以取一个负号
figure,
subplot(121);imshow(I);
subplot(122);imshow(A);
radon变换倾斜校正:
clc;
clear all;
close all;
[fn pn fi]=uigetfile('*.*','choose apicture');
Img=imread([pn fn]);
imshow(Img);title('Original image');
I = rgb2gray(Img);
I=improve_hist(I);
bw=edge(I,'canny');
theta=1:179;
[R,xp]=radon(bw,theta);
[I0,J]=find(R>=max(R(:)));%J记录了倾斜角
if J<=90qingxiejiao=J;
elseqingxiejiao=J-180;
end
I1=imrotate(Img,-qingxiejiao,'bilinear','crop');
subplot(1,2,1),imshow(Img);title('Originalimage');
subplot(1,2,2),imshow(I1);title('correct image');
function [ b1 ] = improve_hist( f1 )
I=f1;
[m,n]=size(I);
I=double(I);
avg=mean(I(:));
mi=min(I(:));
p=0.45;
for i=1:m
for j=1:n
if I(i,j)>avg
I(i,j)=255;
else
I(i,j)=(255-abs((((I(i,j)-avg)^p)*255)/(avg-mi)^p));
end
end
end
mask=fspecial('log');
g=imfilter(I,mask,'replicate');
g=I-g;
g=im2uint8(g);
[~,re]=binary_iterate(g);
b1=re;
end
function [t b1 ] = binary_iterate( f1 )
% 用迭代的方法对图像进行二值化t=mean(f1(:));
is_done=false;
count=0;
while ~is_done                         r1=f1(f1<=t);              r2=f1(f1>t); temp1=mean(r1(:));              if isnan(temp1);                    temp1=0; end temp2=mean(r2(:));               if isnan(temp2)                      temp2=0; end t_new=(temp1+temp2)/2; is_done=abs(t_new-t)<1;             t=t_new;                           count=count+1;                     if count>=1000                    Error='Error:Cannot find the ideal threshold.'  Return                       end
end b1=im2bw(mat2gray(f1),t/256);
end

不能保证对其他图像也能取到好效果。
下载地址:http://pan.baidu.com/s/1kT3D3jp

倾斜校正-表格图像的校正相关推荐

  1. matlab几何失真校正,摄像头图像失真校正

    基于MATLAB的摄像头 图像失真校正 上学的时候玩智能车摄像头组,从发现图像失真.到下载研究各种文档.再到写程序测试.最后实际运用,整个过程很有意思,特别是逆透视变换值得研究.下面的内容是那时候写的 ...

  2. matlab怎么进行色偏校正,色偏图像的校正方法

    色偏图像的校正方法 [专利摘要]本发明提供了一种色偏图像的校正方法,其特征在于包括以下步骤:1.对色偏图像进行软分类,计算每一类图像的比例系数ρk:2.根据ρk对每一类图像进行高光提取,得到每一类图像 ...

  3. matlab 倾斜矫正,matlab图像倾斜校正

    4 图像颜色畸变校正介绍图像颜色畸变现象可以是由摄像器材导致,也可以是由于真实环境本身就偏 色导致,还有的是由于图像放置过久氧化.老化导致.无论其产生的原因如何, 其校正方法都是类似的.如果用 Mat ...

  4. 如何使用OpenCV自动校正文本图像

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天,我们想与您分享解决图像偏移校正问题(拉直旋转图像)的简单解决 ...

  5. opencv离散傅里叶变换进行图像旋转校正

    前言 离散傅立叶变换的一个应用是决定图片中物体的几何方向.     观察这两张幅度图你会发现频域的主要内容(幅度图中的亮点)是和空间图像中物体的几何方向相关的. 通过这点我们可以计算旋转角度并修正偏差 ...

  6. 《Photoshop Lab修色圣典(修订版)》—第1课1.4节逐步校正峡谷图像

    本节书摘来自异步社区<Photoshop Lab修色圣典(修订版)>一书中的第1课1.4节逐步校正峡谷图像,作者[美]Dan Margulis,更多章节内容可以访问云栖社区"异步 ...

  7. 智慧交通day03-车道线检测实现03:相机校正和图像校正的实现

    1.相机标定 根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数. 标定的流程是: 准备棋盘格数据,即用于标定的图片 对每一张图片提取角点信息 在棋盘上绘制提 ...

  8. 鱼眼图像畸变校正——透视变换

    本文转自:[opencv]鱼眼图像畸变校正--透视变换 http://m.blog.csdn.net/article/details?id=50786782 原图 球面透视投影(以空间左手坐标系,x轴 ...

  9. Matlab实现基于二维伽马函数的光照不均匀图像自适应校正算法

    Matlab程序: %% % 基于二维伽马函数的光照不均匀图像自适应校正算法 % %% clc,close all; tic; im=imread('你的图片.jpg'); figure; imsho ...

最新文章

  1. Fisher 线性分类器--转
  2. jquery终止函数
  3. php h5读写数据库,H5学习_番外篇_PHP数据库操作
  4. Shell 操作(一)
  5. 重构手法之重新组织数据【1】
  6. 手工机器人的做法大全用易拉罐_快来吃“智能机器人炒饭”啦!顾客:比人工炒饭还好吃!...
  7. (7)zabbix资产清单inventory管理
  8. from pristine store, because no checksum is recorded for this file
  9. WINDOWS获得当前执行程序路径的办法
  10. 【VRP】基于matlab禁忌搜索算法求解初始点和终点确定的取送货路径问题【含Matlab源码 1224期】
  11. 安卓系统dicom阅读器_文石BOOX发布新品poke2 color 全球首款开放系统彩色电纸书
  12. 批量修改图片格式类型
  13. Unity 动态更改鼠标样式
  14. mysql数据库如何授权_MySQL数据库学习笔记 ---- 数据库授权
  15. 数据分析概念与职业操守
  16. 使用html表格标签做一份简历表
  17. MySQL数据库的基本操作以及数据类型
  18. FPGA实现IIC协议(一)----初识IIC总线
  19. python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆
  20. 企业信息管理系统(4)_用户查询

热门文章

  1. c++怎么用cout按指定位数四舍五入;Matlab 输出小数点后指定为数
  2. 个人独资企业享受怎样的优惠政策,如何减轻企业税负压力?
  3. 速读原著-Java核心技术(安装Java开发工具包)
  4. 收藏一篇期文(来自投机岛)
  5. 给刚入行产品经理的21条建议
  6. Axure教程 | 初级电子商务网站设计
  7. 拉里·埃里森再谈数据安全,机器学习必将火爆未来
  8. KMP快速计算next与nextval
  9. 也谈GDP核算:支出法与收入法中的弯弯绕绕
  10. python - 简单实现预测最近运势