基于Hough变化的图像校正

news/2024/7/21 5:25:03 标签: 计算机视觉, 算法, 图像处理

一、问题背景

下图是一张单据的扫描件,编程计算旋转角度对其进行校正、并补全断裂的表格线。
在这里插入图片描述

二、算法原理

1.基于sobel算子的边缘检测

要想将倾斜表格旋转进行校正,首先要计算表格倾斜的角度,我们用Hough变化来计算倾斜角度,Hough变换前先用sobel算子进行边缘检测;

2.基于Hough变化的倾斜角度计算

Hough变化计算倾斜角度。Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。采用直线的极坐标表示,直线可表示为 ,由此方程可知,原图像空间中的一条直线与极坐标系下的一个点 对应;而原图像空间的任一点 都与一个正弦曲线对应;所有共线的点,其正弦曲线一定过同一个点。可以通过检测参数空间中过某个点的正弦曲线的条数来检测图像空间中共线的点数。设置一个累加数组 ,用它来对过 的曲线进行计数。然后对每一个图像空间中的点给出一个 的取值,根据 计算出对应的 ,对所有过 点的曲线在 中累加计数;最后找出数组中数目最大的 ,此时的 值即为表格的倾斜角度;

3.基于imrotate函数的图像旋转

利用imrotate函数对表格进行旋转;

4.基于Hough变换的图像复原

再次使用Hough变换,对旋转校正后的图像进行处理,设定阈值,找出 大于阈值时的所有直线,并找出直线上的所有点 ,令其对应的灰度值 ,即可将所有表格补全;

三、算法步骤

(1)sobel算子边缘检测;
(2)Hough变化计算倾斜角度;
(3)图像旋转校正;
(4)再次Hough变化找出所有直线;
(5)令直线上所有像素灰度值为0,补全表格;

四、MATLAB程序代码

f=imread('hw4_table.jpg');
 
g=edge(f,'sobel',0.05);%边缘检测
figure
imshow(f);title('原图像');
figure;imshow(g);title('原图像边缘检测');
 
[row,col]=size(f);
rho_max=round(sqrt(row*row+col*col));
A=zeros(2*rho_max,180);%记录点数
pix=cell(2*rho_max,180);%记录坐标x,y
 
for x=1:row
    for y=1:col
        if g(x,y)<1
            continue;
        end
        
        for theta=1:180
            rad=theta/180*pi;
            rho = round(x*cos(rad)+y*sin(rad))+rho_max;        
            A(rho,theta) = A(rho,theta)+1;%累加计数
            pix{rho,theta}=[pix{rho,theta},[x,y]'];
        end
    end
end
B=A(:);
[new,ind]=sort(B,'descend');
[~,b]=find(A==new(1,1))
w=180-b %旋转角度
F=imrotate(f,w);%校正后图像
F(1:50,:)=255;
F(700:745,:)=255;
F(:,1:40)=255;
F(:,1280:1324)=255;
figure;imshow(F);title('图像校正');
 
G=edge(F,'sobel',0.05);%边缘检测
[row1,col1]=size(F);
rho_max1=round(sqrt(row1*row1+col1*col1));
A1=zeros(2*rho_max1,180);%记录点数
pix1=cell(2*rho_max1,180);%记录坐标x,y
 
for x=1:row1
    for y=1:col1
        if G(x,y)<1
            continue;
        end
        
        for theta1=1:180
            rad1=theta1/180*pi;
            rho1 = round(x*cos(rad1)+y*sin(rad1))+rho_max1;        
            A1(rho1,theta1) = A1(rho1,theta1)+1;%累加计数
            pix1{rho1,theta1}=[pix1{rho1,theta1},[x,y]'];
        end
    end
end
[rho1,theta1]=find(A1>=250);
for i=1:length(rho1)    
    pos1=pix1{rho1(i),theta1(i)};
    [~,m]=size(pos1);
    F(pos1(1,1):pos1(1,m),pos1(2,1):pos1(2,m))=0;
end
figure;imshow(F);title('补全表格');

五、处理结果(包括必要的中间结果)

sobel算子边缘检测后的图像:
在这里插入图片描述
Hough变化计算倾斜角度为:
在这里插入图片描述
对倾斜图像进行旋转校正

在这里插入图片描述
设定阈值: ,找出所有直线并对其补全
在这里插入图片描述

六、算法改进

(1)sobel算子边缘检测;
(2)Hough变化计算倾斜角度;
(3)图像旋转校正;
(4)再次Hough变化找出所有直线;
(5)用plot函数连接所有点

改进的MATLAB程序如下:

clc;
clear;
close all;
f=imread('hw4_table.jpg');
figure(1);
imshow(f(:,:,1));
f=padarray(f,[100 100],'symmetric','both');  
i=imrotate(f,2); %theat=178
f=i(:,:,1);
f=f(101:800,101:1400);
g=edge(f,'sobel',0.05);
figure(2);
imshow(f);title('原图');
figure;imshow(g);
[row,col]=size(f);
rho_max=round(sqrt(row*row+col*col));
A=zeros(2*rho_max,180);
pix=cell(2*rho_max,180);
for x=1:row
    for y=1:col
        if g(x,y)<1
            continue;
        end
        for theta=1:180
            rad=theta/180*pi;
            rho = round(x*cos(rad)+y*sin(rad))+rho_max;        
            A(rho,theta) = A(rho,theta)+1;
            pix{rho,theta}=[pix{rho,theta},[x,y]'];
        end
    end
end
figure(3);imshow(f);title('hough变换');
[rho1,theta1]=find(A>207);
for i=1:length(rho1)
    if theta1(i)==90
        pos=pix{rho1(i),theta1(i)};
        hold on
        plot(pos(2,1),pos(1,1):pos(1,end),'.k','LineWidth',0.5);
    end
end
[rho2,theta2]=find(A>230);
for i=1:length(rho2)
    if theta2(i)==180
        pos=pix{rho2(i),theta2(i)};
        hold on 
        plot(pos(2,1):pos(2,end),pos(1,1),'.k','LineWidth',0.5);
    end
end

改进后处理结果:
在这里插入图片描述

参考文献:

[1]顾亚芳. 高斯模糊图像的盲复原[D].东南大学,2006.


http://www.niftyadmin.cn/n/488903.html

相关文章

gwas snp 和_GWAS分析原理浅谈

引言遗传学的研究成功地找到了很多致病突变体&#xff0c;这些突变体是指染色体上的变异位点。GWAS(全基因组关联分析)试图找到染色体上的变异位点&#xff0c;并研究这些变异位点与疾病或其它性状的关联。GWAS常用的方法是回归分析。回归分析的一个假设是&#xff0c;数据是独…

数据库MySQL语言中事务的介绍

一、事务是什么&#xff1f; 1.事务的定义 事务由单独单元的一个或多个SQL语句组成&#xff0c;在这个单元中&#xff0c;每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体&#xff0c;如果单元中某条SQL语句一旦执行失败或产生错误&#xff0c;整个单元将会…

华为怎么把系统语言改成英语_怎么给华为手机更改语言?华为手机设置语言,涨知识了...

目前很多人都开始使用华为手机&#xff0c;手机的语言也分为很多种&#xff0c;有时我们也需要对手机进行个性化的处理&#xff0c;那就需要更改到手机的语言&#xff0c;那么华为手机应该如何更改语言么&#xff1f;接下来&#xff0c;我便分享一些经验步骤给大家。工具/材料手…

数据库MySQL语言中视图的介绍

文章目录一、视图是什么&#xff1f;二、创建视图1.语法2.案例三、视图的修改1.方式一2.方式二四、删除和查看视图1.删除视图2.查看视图五、视图的更新1.对视图进行插入、修改、删除操作2.具备以下特点的视图不允许更新一、视图是什么&#xff1f; 含义&#xff1a;虚拟表&…

vue 注册全局swiper_vue-awesome-swiper踩坑总结

一、背景在项目中使用最新版本的vue-awesome-swiper插件时&#xff0c;发现分页器的显示有bug因此决定重新安装旧版本注意&#xff1a;Swiper6 对应的是 vue-awesome-swiper的最新版本接下来介绍的是基于Swiper2 的 vue-awesome-swiper的v2.6.7版本二、全局安装安装 swipernpm …

MySQL中的变量

文章目录一、变量的分类二、系统变量1.全局变量2.会话变量二、自定义变量1.用户变量2.局部变量3.案例一、变量的分类 二、系统变量 说明&#xff1a;变量由系统定义&#xff0c;不是用户定义&#xff0c;属于服务器层面 注意&#xff1a;全局变量需要添加global关键字&#xf…

MySQL中存储过程的介绍

文章目录前言一、存储过程是什么&#xff1f;二、存储过程的创建1.语法2.参数列表3.存储过程体三、存储过程的调用四、案例演示1.空参列表2.创建带in模式参数的存储过程3.创建out 模式参数的存储过程4.创建带inout模式参数的存储过程五、删除存储过程六、查看存储过程的信息前言…

mysql的密码忘记_MySQL密码忘记,怎么办?

如果哪天你忘记了线上MySQL数据库的root密码&#xff0c;怎么办?大家往往会想到skip-grant-tables参数&#xff0c;具体步骤如下&#xff1a;1. 关闭MySQL数据库&#xff0c;因为root密码忘记了&#xff0c;mysqladmin无法使用&#xff0c;此时&#xff0c;只能通过kill pid关…