CV(4)--边缘提取和相机模型

前言

仅记录学习过程,有问题欢迎讨论

边缘提取(涉及语义分割):

图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分,暗到亮为正

  • 求边缘的幅度:sobel,Canny算子

  • 图像分高频分量和低频分量,高频分量就是灰度变化剧烈的地方(显眼)

图像锐化:目的是使图像的边缘更加清晰,细节部分更加突出,常用拉普拉斯变化核函数。

边缘检测的步骤:边缘检测就是提取高频分量。在边缘像素值会出现”跳跃“或者较大的变化

  1. 滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数(为0,一阶极值),但导数通常对噪声很敏感,
    所以采用滤波减弱噪声。常见的滤波方法主要有高斯滤波。
  2. 增强:增强边缘的基础是确定图像各点邻域强度的变化值并凸显出显著变化点。
  3. 检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,可以采用用阈值化方法来检测方法来对这些点进行取舍。

Canny边缘检测算法:

  1. 灰度化后高斯滤波:消除噪声
    高斯卷积核大小影响Canny检测的性能,越大,检测对噪声敏感越低,定位误差也会增大,5*5还行
  2. 检测图像的水平/垂直边缘:计算梯度—Sobel算子
    用类似于[-1,0,1][-2,0,2][-1,0,1]的矩阵来求梯度的幅值,幅值较大的像素点的为边缘
  3. 非极大值抑制:去除边缘检测带来的杂散响应
    • 搜素局部最大值,抑制非极大值,去除冗余的边缘。通俗就是找到像素局部最大值,其他值置为0,就可以剔除大部分非边缘点。
    • 沿着梯度方向比较像素点的值,保留最大像素点
  4. 双阈值检测和连接边缘:滞后阈值法
    • 大于高阈值为强边缘,小于低阈值不是边缘。介于中间是弱边缘。
    • 阈值的选择取决于给定输入图像的内容,和噪声点的区别就是是否连续:

相机模型(实际就是坐标系转化):

针孔相机模型存在四个坐标系:世界坐标系、摄像机坐标系、图像物理坐标系和图像像素坐标系。

  • 世界坐标系的坐标为Pw(Xw,Yw,Zw),
  • 对应的摄像机坐标系坐标为Po(x,y,z),–齐次方程做坐标系变化
  • 对应的图像物理坐标系的坐标为P’(x’,y’),–相似三角的原理等比例
  • 对应的图像像素坐标系的坐标为p(u,v)。–转化为长度为像素单位!
    在这里插入图片描述

在这里插入图片描述

镜头畸变

  • 畸变是由于透镜形状和制造工艺的误差造成的,分为径向畸变和切向畸变。
  • 径向畸变是由于透镜形状的曲线造成,分为枕形畸变和桶形畸变。
  • 切向畸变是由于透镜制造工艺的误差造成的,分为对称畸变和非对称畸变。
  • 可以通过透视变化(投影为新平面)来矫正畸变图片
    通过4个点(两组x,y)来确定关系,然后投影新平面图片

Canny算法和透视变化

"""
1-实现canny算法

2-实现透视变换
"""
import cv2
import numpy as np

# 实现Canny
def CannyDemo(img, low, high):
    # 灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 高斯滤波
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    # 采用sobel 算子求梯度[x,y方向求梯度,找出变化最大的像素点]
    grad_x = cv2.Sobel(blur, cv2.CV_16S, 1, 0, ksize=3)
    grad_y = cv2.Sobel(blur, cv2.CV_16S, 0, 1, ksize=3)
    # 转回uint8
    abs_grad_x = cv2.convertScaleAbs(grad_x)
    abs_grad_y = cv2.convertScaleAbs(grad_y)
    # 合并梯度
    dst = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)
    # 非极大值抑制
    dst = cv2.Canny(dst, low, high)
    return dst


# 实现透视变化
def getWarpPerspectiveMatrix(img, dst):
    nums = img.shape[0]
    x = np.zeros((2 * nums, 8))  # x*warpMatrix=y
    y = np.zeros((2 * nums, 1))
    for i in range(0, nums):
        x_i = src[i, :]
        y_i = dst[i, :]
        x[2 * i, :] = [x_i[0], x_i[1], 1, 0, 0, 0,
                       -x_i[0] * y_i[0], -x_i[1] * y_i[0]]
        y[2 * i] = y_i[0]

        x[2 * i + 1, :] = [0, 0, 0, x_i[0], x_i[1], 1,
                           -x_i[0] * y_i[1], -x_i[1] * y_i[1]]
        y[2 * i + 1] = y_i[1]
    x = np.mat(x)
    # 用x.I求出x的逆矩阵,然后与y相乘,求出warpMatrix
    matrix = x.I * y  # 求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32

    # 之后为结果的后处理
    matrix = np.array(matrix).T[0]
    matrix = np.insert(matrix, matrix.shape[0], values=1.0, axis=0)  # 插入a_33 = 1
    matrix = matrix.reshape((3, 3))
    return matrix


if __name__ == '__main__':
    img = cv2.imread('lenna.png')

    # canny边缘检测
    # canny = CannyDemo(img, 50,150)
    # cv2.imshow('canny', canny)
    # cv2.waitKey(0)

    # 实现透视变化
    img1 = cv2.imread('photo1.jpg')
    src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
    dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]])
    print(img.shape)
    # 生成透视变换矩阵;进行透视变换
    result = getWarpPerspectiveMatrix(src, dst)
    print("warpMatrix:")
    print(result)
    img_perspective = cv2.warpPerspective(img1, result, (337, 488))
    cv2.imshow("img_perspective", img_perspective)
    cv2.waitKey(0)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936091.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件

sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…

如何用VScode恢复误删文件-linux

如果你用vscode远程在服务器上办公&#xff0c;有一天你用了&#xff1a; rm -rf *然后你发现你的文件不见了&#xff0c;不要着急。 这种方法只适用于不多的几个文件。 这个时候你要做的是&#xff0c;查看右侧的1&#xff1a; 从1里面查找你删除的文件&#xff0c;然后点…

IoTDB 报错 There are no available SchemaRegionGroup RegionGroups currently

现象 现象1&#xff1a; 现象2&#xff1a;时序数据库 IoTDB 系统遇到了一个持续增长的 schema_region 目录问题&#xff0c;导致频繁出现内存溢出&#xff08;OutOfMemory&#xff09;错误。在路径 data/datanode/consensus/schema_region 下&#xff0c;系统每分钟都会创建多…

使用ERA5数据绘制风向玫瑰图的简易流程

使用ERA5数据绘制风向玫瑰图的简易流程 今天需要做一个2017年-2023年的平均风向的统计,做一个风向玫瑰图&#xff0c;想到的还是高分辨率的ERA5land的数据&#xff08;0.1分辨率&#xff0c;逐小时分辨率&#xff0c;1950年至今&#xff09;。 风向&#xff0c;我分为了16个&…

hbuilder 安卓app手机调试中基座如何设置

app端使用基座 手机在线预览功能 1.点击运行 2.点击运行到手机或者模拟器 3.制作自定义调试基座 4.先生成证书【可以看我上一篇文档写的有】&#xff0c;点击打包 5.打包出android自定义调试基座【android_debug.apk】,【就跟app打包一样需要等个几分钟】 6.点击运行到手…

Qt编写RK3588视频播放器/支持RKMPP硬解/支持各种视音频文件和视频流/海康大华视频监控

一、前言 用ffmpeg做硬解码开发&#xff0c;参考自带的示例hw_decode.c即可&#xff0c;里面提供了通用的dxva2/d3d11va/vaapi这种系统层面封装的硬解码&#xff0c;也就是无需区分用的何种显卡&#xff0c;操作系统自动调度&#xff0c;基本上满足了各种场景的需要&#xff0…

Photoshop提示错误弹窗dll缺失是什么原因?要怎么解决?

Photoshop提示错误弹窗“DLL缺失”&#xff1a;原因分析与解决方案 在创意设计与图像处理领域&#xff0c;Photoshop无疑是众多专业人士和爱好者的首选工具。然而&#xff0c;在使用Photoshop的过程中&#xff0c;有时会遇到一些令人头疼的问题&#xff0c;比如突然弹出的错误…

EXCEL 数据透视表基础操作

目录 1 选择数据&#xff0c;插入数据透视表 2 选择数据透视表生成位置 3 出现了数据透视表的面板 4 数据透视表的基本结构认识 4.1 交叉表/列联表 4.2 row, column, cell 一个新增的筛选器&#xff0c;就这么简单 4.3 可以只添加 rowcell/值 &#xff0c;也可以colu…

AI生成图表化:深入探索Mermaid

引言 在使用生成式AI时&#xff0c;只要你提出让AI帮你生成mermaid图&#xff0c;AI的生成就会出现丰富的图形&#xff01; 在现代文档编写中&#xff0c;图表的使用不仅能增强文档的可读性&#xff0c;还能更直观地表达复杂的概念和流程。Mermaid 作为一款开源的图表绘制工具…

iOS runtime总结数据结构,消息传递、转发和应用场景

runtime篇 首先看一下runtiem底层的数据结构 首先从objc_class这么一个结构体&#xff08;数据结构&#xff09;开始&#xff0c;objc_class继承于objc_object。 objc_object当中有一个成员变量叫isa_t&#xff0c;那么这个isa_t指针就指向一个objc_class类型的类对象&#xff…

前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor

与框架无关 vue2-ace-editor有问题&#xff0c;ace拿不到&#xff08;brace&#xff09; 一些组件都是基于ace-builds或者brace包装的 不如直接用下面的&#xff0c;不如直接使用下面的 <template><div ref"editor" class"json-editor"><…

QT:在线安装与离线安装

QT 学习系列 QT&#xff1a;在线安装与离线安装 QT 学习系列一、安装&#xff08;一&#xff09;离线安装windows系统Linux 系统Mac 系统 &#xff08;二&#xff09;在线安装 二、 环境变量配置三、验证总结 一、安装 &#xff08;一&#xff09;离线安装 windows系统 获取…

国产固态继电器的演变:可靠的电源解决方案

家用国产固态继电器(SSR)已成为各行各业的基石&#xff0c;性能可靠、设计紧凑、效率高。这些先进的开关设备取代了传统的机电继电器&#xff0c;具有静音运行、使用寿命更长、可靠性更高等诸多优点。家用SSR专为从工业自动化到家用电器等各种应用而设计&#xff0c;展示了本地…

Java-DataX 插件机制示例

示例代码 DataXPluginExample: DataX 项目的plugin 机制学习https://gitee.com/wendgit/data-xplugin-example/ 摘要 DataXPluginExample 是一个我编写的专门解读DataX插件机制的示例项目&#xff0c;旨在深入解析和掌握DataX的插件机制。本示例通过简洁明了的实现方式&#…

Ubuntu boot-repair安装过程

本教程只是在UBuntu系统无法引导才使用的方法&#xff0c;有可能需要提前使用U盘刻录UBuntu镜像去引导。 假如winUBuntu双系统&#xff0c;找不到紫色的UBuntu界面了&#xff0c;请参考&#xff1a;windows10ubuntu双系统开机引导界面不见的解决办法_双系统不出现引导界面-CSD…

苹果公司即将为iPhone和智能家居改用自主研发的蓝牙和Wi-Fi芯片

美股快讯&#xff1a;苹果公司即将为iPhone和智能家居改用自主研发的蓝牙和Wi-Fi芯片 苹果公司计划从明年开始在其设备上改用国产芯片进行蓝牙和Wi-Fi连接&#xff0c;此举将逐步淘汰目前由博通提供的部分部件。这种代号为Proxima的芯片已经开发了数年&#xff0c;现在计划用于…

汽车车牌识别数据集,支持YOLO,COCO,VOC格式的标注,8493张图片,可识别多种环境下的车牌

汽车车牌识别数据集&#xff0c;支持YOLO&#xff0c;COCO&#xff0c;VOC格式的标注&#xff0c;8493张图片&#xff0c;可识别多种环境下的车牌 数据集分割 训练组82&#xff05; 6994图片 有效集12&#xff05; 999图片 测试集6% 500图片 预处理 自动…

Towards Frame Rate Agnostic Multi-object Tracking—迈向帧率无关的多目标跟踪

Towards Frame Rate Agnostic Multi-object Tracking—迈向帧率无关的多目标跟踪 发表在IJCV 2023年 作者&#xff1a;Weitao Feng, Lei Bai, Yongqiang Yao, Fengwei Yu & Wanli Ouyang 研究目标&#xff1a;多目标跟踪的帧率无关性研究 IJCV 在计算机视觉领域的影响力非常…

day11 性能测试(3)——Jmeter 断言+关联

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、复习 2、查看结果树 多个http请求原因分析 3、作业 4、Jmeter断言 4.1 响应断言 4.1.1 案例 4.1.2 小结 4.2 json断言 4.2.1 案例 4.2.2 小结 4.3 断言持续时间 4.3.1 案例 4.3.2 小结 4.…