基于Hough变化的图像校正

2023-10-27

一、问题背景

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

二、算法原理

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Hough变化的图像校正 的相关文章

  • 将向量(或弧)绘制到玫瑰图上。 MATLAB

    我有两个数据集 其中详细列出了angles 我正在绘制玫瑰图 angles 0 8481065519 0 0367932161 2 6273740453 n 另一个 从这组角度详细说明方向统计 angle error 0 848106563
  • 使用简单矩阵乘法时出错

    我在一次简单的乘法运算中偶然发现了一个错误 这让我感到非常惊讶 我一直以为这里发生了什么 只为矩阵乘法 http www mathworks nl help matlab matlab prog operators html x 2 y z
  • MATLAB 变量传递和惰性赋值

    我知道在 Matlab 中 当将新变量分配给现有变量时 会进行 惰性 评估 例如 array1 ones 1 1e8 array2 array1 的价值array1不会被复制到array2除非元素array2被修改 由此我推测Matlab中
  • Matlab:2行10列的子图

    如何在 matlab 中绘制 20 幅图像 2 行 10 列 我知道我必须使用 子图 功能 但我对给出的参数感到困惑 我尝试给予 子图 2 10 行索引 列索引 但它似乎不起作用 请帮忙 的前两个参数subplot函数分别给出图中子图的总行
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • 使用不同的背景颜色保存 MATLAB 图窗

    我想打印一个带有深色背景和白色标签的 MATLAB 图 如果我使用print or saveas命令我不知何故失去了颜色 绘图符号再次变暗 背景变为白色 points rand 100 3 plot3 points 1 points 2 p
  • Matlab strcat 不返回字符串?

    imgstr 无法识别 strcat 的输出字符串 homedir C Users images for img 01 bmp 02 bmp 03 bmp imgstr strcat homedir img I imread imgstr
  • MATLAB 中的逻辑数组与数值数组

    我正在比较两个二进制数组 我有一个数组 其中值可以是一或零 如果值相同则为 1 如果不同则为零 请注意 我正在做检查之外的其他事情 因此我们不需要进入矢量化或代码的性质 在 MATLAB 中使用数值数组和逻辑数组哪个更有效 Logical
  • MATLAB:图像角坐标和引用元胞数组

    我在比较不同元胞数组中的元素时遇到一些问题 这个问题的背景是我正在使用bwboundariesMATLAB 中的函数可追踪图像的轮廓 该图像是结构横截面 我试图找出整个部分是否具有连续性 即 只有一个轮廓由bwboundaries命令 完成
  • 图像处理方面的空间和时间表征有什么区别?

    我是学习图像处理的初学者 我对空间和时间表征的概念有点困惑 那么 对于空间表征来说 是不是像一张二维地图 包含了一些关于地图的统计信息呢 就时间特征而言 值是相对于时间的吗 这意味着什么以及我们为何关心 谢谢 当您在不同时间拍摄一系列图像时
  • 基本矩阵错误?

    我试图通过扫描从相机拍摄的两个图像 检测图像中的特征 匹配它们 创建基本矩阵 使用相机内在函数计算基本矩阵 然后分解它以找到旋转和翻译 这是matlab代码 I1 rgb2gray imread 1 png I2 rgb2gray imre
  • 如何从 Matlab 运行 R 脚本 [重复]

    这个问题在这里已经有答案了 我有 m 文件 我想用它来运行 R 脚本 我怎样才能做到这一点 Matlab文件 caller m some matlab code need to call a R script some matlab cod
  • 二维随机微分方程 (SDE)

    我第一次研究随机微分方程 我正在寻求模拟和求解二维随机微分方程 模型如下 dp F t p dt G t p dW t where p 是一个 2 1 向量 p theta t phi t F是列向量 F sin theta Psi cos
  • 在 MATLAB 中验证输入的最佳实践

    在验证 MATLAB 函数中的输入时 什么时候使用 inputParser 比使用断言更好 或者还有其他更好的工具可用吗 我个人发现使用 inputParser 不必要地复杂 对于 Matlab 始终需要检查 3 项内容 存在 类型和范围
  • MATLAB - 从目录读取文件?

    我希望从目录中读取文件并对每个文件迭代执行操作 此操作不需要更改文件 我知道我应该为此使用 for 循环 到目前为止我已经尝试过 FILES ls path to folder for i 1 size FILES 1 STRU pdbre
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • MATLAB 中的内存映射文件?

    我决定使用 memmapfile 因为我的数据 通常为 30Gb 到 60Gb 太大 无法放入计算机内存中 我的数据文件由两列数据组成 对应于两个传感器的输出 并且它们采用 bin 和 txt 格式 m memmapfile G E Str
  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 通过 h5py 将 matlab v7.3 文件读入 python numpy 数组列表

    我知道以前已经有人问过这个问题 但在我看来 仍然没有答案可以解释正在发生的事情 并且不适用于我的情况 我有一个 matlab v7 3 文件 其结构如下 gt rank lt 1x454 cell gt gt each element is
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整

随机推荐

  • linux内核I2C子系统详解——看这一篇就够了

    1 I2C通信协议 参考博客 I2C通信协议详解和通信流程分析 2 通过KXTF9 2050芯片分析I2C协议 参考博客 通过KXTF9 2050芯片分析I2C协议 3 I2C子系统框架 1 I2C子系统分为三层 I2C核心层 I2C适配器
  • 【Elasticsearch】 05-桶聚合查询详解及示例

    1 引言 Elasticsearch 是一款强大的分布式搜索和分析引擎 提供了丰富的聚合查询功能 桶聚合 Bucket Aggregations 是其中一种重要的聚合查询方式 本文将详细介绍 Elasticsearch 的桶聚合查询 并提供
  • 盘点全球8K视频直播的解决方案和成果

    8K是什么 简单来说 8K就是更加清晰的视觉体验 8K分辨率高达7680 4320像素 是4K分辨率的4倍 很多公司早就已经开始布局研发8K产品和技术了 就众视媒体小编ZL了解所得 早在2013年CES展会上 夏普就推出了全球首款85寸8K
  • AS把本地项目放到远程git和从远程git拉取项目到本地

    在开发项目过程中时常会将本地代码上传至远程git仓库 作为代码备份或者团队共同开发 本章讲解下 AS如何将本地项目上传至远程git和从远程git拉取项目到本地 一 AS将本地项目上传至远程git 准备步骤 1 先下载windows上的git
  • Anaconda3 离线安装和配置 Django-3.2.7 使用 MySQL-5.7 数据库

    Django文档 Settings Core Settings DATABASES 一节阐述了django与数据库交互配置的内容 先在 MySQL 5 7 版本数据库中创建一个名为 learning log db 的数据库 和名为 myus
  • VMware安装win10虚拟机教程及常见问题

    win10虚拟机安装教程 一 前言 1 准备VMware虚拟机 可自行到VMware官网 或 点击链接 下载正版VMware Workstation Pro 2 准备需要安装的win10镜像 下载地址 下载 Windows 10 3 文章不
  • Win10中Docker下修改mysql配置(主要修改utf-8字符集)

    由于要修改MySQL的配置文件 在命令行修改每次重启都会失效 所以想修改Docker下的mysql配置文件 这样将其再作为一个镜像保存 以后就可以一劳永逸了 在Win10的Docker容器中进行vi操作时 没有Linux中的vi操作那么顺畅
  • 程序员面试题精选100题(35)-两链表的第一个公共结点

    程序员面试题精选100题 35 两链表的第一个公共结点 题目 两个单向链表 找出它们的第一个公共结点 链表的结点定义为 struct ListNode int m nKey ListNode m pNext 分析 这是一道微软的面试题 微软
  • 用Java去掉中文中括号【】,你学废了吗?

    大家好 今天我有多了一个需求 甲方爸爸让我取中文括号里的文本 这可怎么办嘛 费劲心思 i get do not bb show me code ok String msg sadasd 的范德萨发斯蒂芬斯蒂芬 打撒所所多多 String r
  • C语言常用的8种滤波算法

    最近在研究一些滤波算法 扒了网络上的一些算法做了总结 并加入了自己思考和想法 梳理一些代码 仅供参考学习 1 滑动平均滤波 A 名称 递推平均滤波法 又称滑动平均滤波法 B 方法 把连续取得的N个采样值看成一个队列 队列的长度固定为N 每次
  • SSM框架整合之单表操作

    1 Spring和Spring MVC父子容器 概念介绍 1 在Spring与SpringMVC进行整合的时候 一般情况下我们会使用不同的配置文件来配置Spring和SpringMVC 因此我们的应用中会存在至少2个ApplicationC
  • 学了C++能做什么?

    相信很多人接触编程都是源于大学期间的那堂C 语言程序编程 但是这门课却只告诉了你编程语言是什么 却没告诉你要怎么去熟练掌握编程 所以 不可避免的是许多人在毕业前夕才发现虽然学会了C 但是好像却不知道能干什么 能找什么样的工作 能去什么样的公
  • 创建oracle的sequence 和 trigger

    Create sequence NOMAXvalue create sequence SEQ ADMIN ID minvalue 1 maxvalue 99999999 NOMAXvalue start with 1 increment b
  • 范数和正则化

    概念 范数是具有 长度 概念的函数 在向量空间内 为所有的向量的赋予非零的增长度或者大小 不同的范数 所求的向量的长度或者大小是不同的 举个例子 2维空间中 向量 3 4 的长度是5 那么5就是这个向量的一个范数的值 更确切的说 是欧式范数
  • osgEarth各个示例分析目录

    概述 由于数字地球项目需要osgEarth的代码知识 故决定学习osgEarth的示例 示例中有很多可以借鉴的内容 以下是分析目录 完全是随机进行的 并没有什么上下文逻辑 每一篇代码边学习边分析 如果有错误 请各路大佬斧正 目录 osgEa
  • matlab函数怎么写,matlab怎么写主函数

    1 matlab怎么写函数文件 1 首先在电脑中打开baimatlab软件 2 在打开的页面中点击 du主页 栏目下的 新建 按钮 zhi 3 然后在打开的下拉菜单中选择 函数 选项 4 即可打开函数编辑器 在其中dao可以进行函数的输入设
  • 稀疏光流KLT跟踪算法

    1 前言 前段时间学习了Harris角点检测和Shi Tomasi角点检测 但实际用途没用 特此记录一下运用角点的稀疏光流KLT跟踪算法 2 概念 2 1光流概念 光流是空间运动物体在观察成像平面上的像素运动的瞬时速度 是利用图像序列中像素
  • xacml开源代码

    http blog csdn net gxp article details 6799957 t2 pam xacml the extensible access control markup language xacml allows f
  • 图像风格迁移实战

    最近看了一些基于深度学习的Style Transfer 也就是风格迁移相关的paper 感觉挺有意思的 所谓风格迁移 其实就是提供一幅画 Reference style image 将任意一张照片转化成这个风格 并尽量保留原照的内容 Con
  • 基于Hough变化的图像校正

    一 问题背景 下图是一张单据的扫描件 编程计算旋转角度对其进行校正 并补全断裂的表格线 二 算法原理 1 基于sobel算子的边缘检测 要想将倾斜表格旋转进行校正 首先要计算表格倾斜的角度 我们用Hough变化来计算倾斜角度 Hough变换