[图像处理]边缘提取以及Harris角点检测

2023-11-19

在本周的计算机视觉与模式识别作业中,给定输入图像是两张普通A4打印纸,上面可能有手写笔记或者打印内容但是拍照时角度不正。要求输出:
1. 图像的边缘;
2. 计算 A4纸边缘的各直线方程;
3. 提取A4纸的4个角点。
这里写图片描述
这里写图片描述


作业要求的是使用C++的CImg库,与OpenCV和MATLAB相比,CImg还是有点不太方便。

  • 图像边缘的提取
    这个任务比较简单,找一个像Prewitt算子、拉普拉斯算子或是其他算子,对输入图像进行卷积计算就可以了,原理是计算图像像素的变化,而变化剧烈的地方就是图像边缘出现的地方。
    这里我使用了Sobel算子来进行边缘提取并二值化。
    int sobelX[3][3] = { { -1,0,1 },{ -2,0,2 },{ -1,0,1 } };
    int sobelY[3][3] = { { 1,2,1 },{ 0,0,0 },{ -1,-2,-1 } };
    Sobel算子就是分别求图像X、Y方向的梯度,再求梯度平方和,小于某个阈值置为0,反之为255。
    最后结果如下:
    图1
    图2
  • Harris角点的检测
    主要时间都花费在这部分的实现上面了。这里推荐一篇文章,里面详解了Harris角点检测算法的原理、步骤,还给出了OpenCV实现的代码。
    http://www.cnblogs.com/ronny/p/4009425.html
    还有一些有帮助的文章:
    http://blog.csdn.net/l_inyi/article/details/8915116
    http://blog.csdn.net/berguiliu/article/details/24985825
    关键步骤如下:
    这里写图片描述
    而我自己则是在理解该文章所写算法的基础上,使用CImg库按步骤地搜索网上的资料,完成每一部分之后,检测出了角点。
    在实现过程中遇到的问题主要有:
    • 在求x、y方向梯度的时候,一开始使用的是一位的模板,导致检测到的角点过多,容易混淆。后来经过实验,改成了二维的3X3模板,效果较好;
    • 在第三步使用高斯加权的时候,我以为是对各梯度矩阵使用高斯分布的公式:这里写图片描述
      角点检测的结果:这里写图片描述
      明显不太对。
      后来查阅资料才认识到应该使用高斯低通滤波窗口对Ixx、Iyy、Ixy进行卷积。更正之后的结果:
      这里写图片描述这里写图片描述
  • 求边缘直线方程
    在Harris角点检测所得的图片当中,可以看到四个角的角点是独立出来的,能够比较容易地提取它们的坐标。因此可以利用Harris角点检测过程中计算的result数组来找到四个顶点的坐标,有了坐标之后四条直线的方程也就知道了。
    最后求得的方程:
    角点和方程

差点忘了贴代码:

// CV_HW2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include "CImg.h"
using namespace cimg_library;
using namespace std;

/*

CImg<> edgeDetect(CImg<> src) {
    int mask[3][3] = { {0,-1,0},{-1,4,-1},{0,-1,0} };
    int width = src.width();
    int height = src.height();
    CImg<double> newImg(width, height, 1, 3);
    newImg.fill(0);
    for (int i = 1; i < width - 1; i++) {
        for (int j = 1; j < height - 1; j++) {

            for (int k = 0; k < 3; k++) {
                double sum = 0.0;
                for (int row = 0; row < 3; row++) {
                    for (int col = 0; col < 3; col++) {
                        sum += mask[row][col] * src(i - 1 + row, j - 1 + col, k);
                    }
                }
                if (sum < 0)
                    sum = 0;
                else if (sum > 255)
                    sum = 255;
                newImg(i, j, k) = sum;
            }
        }
    }
    newImg.display();
    return newImg;
}
*/

CImg<> edgeDetect(CImg<> src) {
    int sobelX[3][3] = { { -1,0,1 },{ -2,0,2 },{ -1,0,1 } };
    int sobelY[3][3] = { { 1,2,1 },{ 0,0,0 },{ -1,-2,-1 } };
    int width = src.width();
    int height = src.height();
    CImg<double> G(width, height, 1, 3);
    CImg<double> newImg(width, height, 1, 3);
    newImg.fill(0);
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[图像处理]边缘提取以及Harris角点检测 的相关文章

  • 深度学习训练之optimizer优化器(BGD、SGD、MBGD、SGDM、NAG、AdaGrad、AdaDelta、Adam)的最全系统详解

    文章目录 1 BGD 批量梯度下降 2 SGD 随机梯度下降 2 1 SGD导致的Zigzag现象 3 MBGD 小批量梯度下降 3 1 BGD SGD MBGD的比较 4 SGDM 5 NAG 6 AdaGrad Adaptive Gra
  • OPENCV手势识别抓取图片

    PENCV手势识别抓取图片 一位油管的小哥做的项目非常棒 照着写了一个 代码 注意 看好cvzone的版本 太新的版本中有个函数没有 如果找不到这个函数的时候请更换一下库的版本 import cv2 from cvzone HandTrac
  • 深度学习之Python,OpenCV中的卷积

    这篇博客将介绍图像内核和卷积 如果将图像视为一个大矩阵 那么图像内核只是一个位于图像顶部的微小矩阵 从左到右和从上到下滑动内核 计算输入图像和内核之间的元素乘法总和 称这个值为内核输出 内核输出存储在与输入图像相同 x y 坐标的输出图像中
  • windows8.1 vs2015 dlib库cpu 版本编译以及应用 library is 90, caller expects 80

    近期由于要做一个关于人脸计数的项目 因此对dlib库进行了编译和使用 其中遇到了不少问题 下面请听我一一道来 第一步 从dlib官网下载dlib源码 链接地址 https github com davisking dlib 第二步 采用cm
  • matlab 读取某一文件夹下的文件

    MATLAB 是一个十分强大的科学计算软件 用于各种数据分析和科学计算 在实际工作和研究过程中 我们通常将数据存储在文件中 文件存在于系统的某个目录中 如果需要读取这些文件 可以使用 MATLAB 提供的文件和文件夹操作函数 本文将介绍如何
  • 图像处理 --- 一、认识图像处理

    声明 本系列文档由学习哔站视频总结而得 后续会逐渐添加相对应的示例代码 python 1 什么是图像与图像处理 百闻不如一见 图像是客观对象的一种相似性的 生动性的描述或写真 是人类社会活动中最常用的信息载体 或者说图像是客观对象的一种表示
  • 数字图像处理(入门篇)六 图像数据预处理之坐标变化

    目录 1 平移 2 镜像 3 旋转 4 缩放 图像的坐标变换又称为图像的几何计算 常见的基本变换包括 平移 旋转 镜像和缩放等等 1 平移 1 代码 使用OpenCV仿射变换函数 cv2 warpAffine 实现平移操作 import n
  • mingw qt5.14.2 编译 vtk9.1.0

    1 软件 qt版本 qt opensource windows x86 5 14 2 exe 安装mingw选项 cmake版本 cmake 3 21 2 windows x86 64 msi VTK源码版本 VTK 9 1 0 tar g
  • [图像处理]边缘提取以及Harris角点检测

    在本周的计算机视觉与模式识别作业中 给定输入图像是两张普通A4打印纸 上面可能有手写笔记或者打印内容但是拍照时角度不正 要求输出 1 图像的边缘 2 计算 A4纸边缘的各直线方程 3 提取A4纸的4个角点 作业要求的是使用C 的CImg库
  • CUDA的下载安装

    大家好 下面将进行CUDA的下载安装 下载安装的详细步骤描述如下 1 CUDA下载 https download csdn net download qq 41104871 87462747 2 CUDA安装 1 首先 需要解压缩下载好的C
  • 图像恢复(加噪与去噪)

    人工智能导论实验导航 实验一 斑马问题 https blog csdn net weixin 46291251 article details 122246347 实验二 图像恢复 https blog csdn net weixin 46
  • 【从小项目学图片处理】#1 答题卡识别

    说明 项目皆参考于网上 代码也有大部分参考原文 仅用于学习和练习图像处理操作 项目原文 Bubble sheet multiple choice scanner and test grader using OMR Python and Op
  • 图像二值化

    文章目录 1 图像二值化 2 图像二值化方法及Python实现 2 1 简单二值法 2 2 平均值法 2 3 双峰法 2 4 OTSU法 3 opencv python中二值化方法的应用 3 1 简单阈值分割 Simple Threshol
  • 九宫格人车识别

    一 原理 通过霍夫检测圆的个数来识别小人位置 二 过程 1 二值图像 2 去掉宫格内容 便于分割 3 对二值图填补 减少纹理 4 分割九宫格 依次检测每个宫格中圆个数 5 最终显示小人所在宫格图片 在img6 jpg中 详细程序运行结果 三
  • Edraw Max教程】如何有趣的创建梦幻般的思维导图

    Edraw Max 亿图图示 是一款综合图形图表制作软件 它包含丰富的实例和模版 帮助您轻松创建流程图 网络拓扑图 组织结构图 商业图表 工程图 思维导图 软件设计图和平面布局图等 亿图采用更智能和人性化的绘制方式 最大程度帮助设计者降低工
  • MEF:COA-NET

    COA NET COLLABORATIVE ATTENTION NETWORK FOR DETAIL REFINEMENT MULTI EXPOSURE IMAGE FUSION COA NET 用于细节细化多曝光图像融合的协作关注网络 近
  • 基于TensorFlow2实现的宠物识别系统(爬虫、模型训练和调优、模型部署)

    目录 开发环境 0 项目准备 1 数据集准备 2 数据预处理 3 构建模型 4 模型训练及验证 5 模型部署 6 项目地址 开发环境 作者 嘟粥yyds 时间 2023年8月25日 集成开发工具 PyCharm Professional 2
  • 图像处理——我理解的傅里叶变换

    1 傅里叶变换的理解 傅里叶变换的相关数学公式目前还没有搞懂 先不整那个东西 我们主要是研究傅里叶变换的一些思想和应用 这个思想起源于牛顿研究那个三棱镜 白光透过棱镜之后会被分解为七种颜色的光 这些光叠加又能形成白光 所以说可以把一种事物分
  • MATLAB算法实战应用案例精讲-【图像处理】缺陷检测(补充篇)

    目录 前言 疵点缺陷识别 1边缘增强 1 1经典算子 1 2坯布疵点边缘检测
  • 【图像配准】

    非配对配准 Non rigid registration 和配对配准 Rigid registration 是医学图像配准中常用的两种方法 它们有着不同的含义和应用 非配对配准 Non rigid registration 非配对配准是指将

随机推荐