【OpenCV 】插值的方法原理,图片缩放,矫正,边界填充

news2024/11/15 23:59:22

图像旋转 缩放

计算机中的图像是以数组的方式储存,每个位置储存了像素点的像素值。对图像进行旋转缩放,就是对数组进行操作,乘以对应的矩阵,进行空间变换,而矩阵的行列式的值,就是缩放的倍数。

进行缩放旋转操作时,会产生像素点的变化,空间和数量的变化,所以需要对变化的图片进行插值

插值是通过变化后图像的像素点的坐标,通过缩放倍数,找到原图对应的像素点坐标,通过权重得到新的像素值

其中目标像素点与原图像的像素点的对应公式如下所示:
s r c X = d s t X ∗ s r c W i d t h d s t W i d t h s r c X=d s t X*{\frac{s r c W i d t h}{d s t W i d t h}} srcX=dstXdstWidthsrcWidth

s r c Y = d s t Y ∗ s r c H e i g h t d s t H e i g h t s r c Y=d s t Y*{\frac{s r c H e i g h t}{d s t H e i g h t}} srcY=dstYdstHeightsrcHeight

src是原图,dst是变换后的图像,通过缩放倍数,得到对应原图的x和y的坐标,是个小数。

  • 最近零插值INTER_NEAREST

    • 通过对得到的坐标向下取整,直接获得原图对应位置的像素值
  • 双线性插值INTER_LINEAR

    • 根据得到的小数坐标重新取像素值,权重取决于和周围点的距离,越近权重越高

    • 小数的坐标对应原图周围四个像素点,对两个方向分别根据距离加权求和,之后再对的到的两个值进行加权求和

    • 把p分为到两个点R1 R2 分别通过Q12Q22 和 Q11Q21根据距离获得像素值,再根据距离由R1R2得到p的像素值

    • 在这里插入图片描述

在这里插入图片描述

  • f ( R 1 ) ≈ x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) f(R_{1})\approx\frac{x_{2}-x}{x_{2}-x_{1}}f(Q_{11})+\frac{x-x_{1}}{x_{2}-x_{1}}f(Q_{21}) f(R1)x2x1x2xf(Q11)+x2x1xx1f(Q21)

    f ( R 2 ) ≈ x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) f(R_{2})\approx\frac{x_{2}-x}{x_{2}-x_{1}}f(Q_{12})+\frac{x-x_{1}}{x_{2}-x_{1}}f(Q_{22}) f(R2)x2x1x2xf(Q12)+x2x1xx1f(Q22)

    f ( P ) ≈ y 2 − y y 2 − y 1 f ( R 1 ) + y − y 1 y 2 − y 1 f ( R 2 ) f(P)\approx{\frac{y_{2}-y}{y_{2}-y_{1}}}f(R_{1})+{\frac{y-y_{1}}{y_{2}-y_{1}}}f(R_{2}) f(P)y2y1y2yf(R1)+y2y1yy1f(R2)

  • v

  • 像素区域插值INTER_AREA

    • 缩小图像,变成均值滤波
    • 放大图像
      • 整数倍是最近邻插值
      • 否则就是双线性插值
  • 双三次插值INTER_CUBIC

    • 使用原图中的16像素点进行加权求像素值

    • 像素点的权重通过公式分别求出水平方向和垂直方向的权重,再相乘

    • BiCubic函数

      在这里插入图片描述

    • a为-0.5或-0.75

  • Lanczos插值INTER_LANCZOS4

    • 和双三次插值相似,但是使用了64个像素点

    • 使用新的权重公式

    • 在这里插入图片描述

    • a = 2是适用于缩小,a=3适用放大

import cv2
import numpy

nut = cv2.imread('./media/nut.png')
w = nut.shape[0]
h = nut.shape[1]

mat = cv2.getRotationMatrix2D((0,0),0,2)
nut1 = cv2.warpAffine(nut,mat,(h*2,w*2),flags=cv2.INTER_LINEAR)
nut2 = cv2.warpAffine(nut,mat,(h*2,w*2),flags=cv2.INTER_CUBIC)
nut3 = cv2.warpAffine(nut,mat,(h*2,w*2),flags=cv2.INTER_LANCZOS4)
nut4 = cv2.warpAffine(nut,mat,(h*2,w*2),flags=cv2.INTER_NEAREST)

cv2.imshow('nut1',nut1)
cv2.imshow('nut2',nut2)
cv2.imshow('nut3',nut3)
cv2.imshow('nut4',nut4)
cv2.imshow('nut',nut)
cv2.waitKey(0)

在这里插入图片描述

边界填充

import cv2
import numpy as np

# 边界复制  BORDER_REPLICATE  把边界的像素值作为边缘的填充

# 边界反射 BORDER_REFLECT  以边界为对称线反转过去作为边缘填充 

# 边界反射101 BORDER_REFLECT_101  边界放射不同之处在于 不把边界作为对称的部分 

# 边界常数 BORDER_CONSTANT  指定常数 以常数填充

# 边界包裹 BORDER_WRAP 平铺

img = cv2.imread('./media/nut.png')
shape = img.shape
m = cv2.getRotationMatrix2D((shape[0]//2,shape[1]//2),45,0.25)  

img2 = cv2.warpAffine(img,m,(shape[1],shape[0]),flags=cv2.INTER_LINEAR,borderMode=cv2.BORDER_REPLICATE)  

img3 = cv2.warpAffine(img,m,(shape[1],shape[0]),cv2.INTER_AREA,borderMode=cv2.BORDER_REFLECT)  

img4 = cv2.warpAffine(img,m,(shape[1],shape[0]),cv2.INTER_CUBIC,borderMode=cv2.BORDER_REFLECT_101)  

img5 = cv2.warpAffine(img,m,(shape[1],shape[0]),cv2.INTER_LANCZOS4,borderMode=cv2.BORDER_CONSTANT,borderValue=127)  

img6 = cv2.warpAffine(img,m,(shape[1],shape[0]),cv2.INTER_LANCZOS4,borderMode=cv2.BORDER_WRAP)  


cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.imshow('img5',img5)
cv2.imshow('img6',img6)
cv2.waitKey(0)

在这里插入图片描述

图片翻转

import cv2
import numpy as np

img = cv2.imread('./media/nut.png')
img1 = img[::-1] # 垂直翻转
img2 = cv2.flip(img,0) # 0 垂直翻转 
img3 = cv2.flip(img,1) # 大于0 水平翻转
img4 = cv2.flip(img,-1)  # 小于0 水平垂直翻转
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.waitKey(0)

在这里插入图片描述

图片缩放

import cv2
import numpy as np

img1 = cv2.imread('./media/shapan.jpg')
img2 = cv2.resize(img1,dsize=None,fx=0.25,fy=0.25,interpolation=cv2.INTER_LINEAR)
# x方向缩放  y方向缩放 插值方式
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
# cv2.imwrite('./media/shapan.jpg',img2)
cv2.waitKey(0)

图片矫正

import cv2
import numpy as np
img = cv2.imread('./media/liner_road.png')
w,h,_ = img.shape

potion = [
    [415,50],
    [506,50],
    [60,560],
    [872,560]
]
new_p = np.float32([
    [0,0],
    [h,0],
    [0,w],
    [h,w]
])
p = np.float32(potion)

# cv2.line(img,p[0].astype(np.int64).tolist(),p[1].astype(np.int64).tolist(),(0,0,255),2,cv2.LINE_AA)
# cv2.line(img,p[1].astype(np.int64).tolist(),p[3].astype(np.int64).tolist(),(0,0,255),2,cv2.LINE_AA)
# cv2.line(img,p[3].astype(np.int64).tolist(),p[2].astype(np.int64).tolist(),(0,0,255),2,cv2.LINE_AA)
# cv2.line(img,p[2].astype(np.int64).tolist(),p[0].astype(np.int64).tolist(),(0,0,255),2,cv2.LINE_AA)
mat = cv2.getPerspectiveTransform(p,new_p)
img2 = cv2.warpPerspective(img,mat,(h,w))

cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stm32智能颜色送餐小车(ESP8266WIFI模块、APP制作、物联网模型建立、MQTTFX)

大家好啊,我是情谊,今天我们来介绍一下我最近设计的stm32产品,我们在今年七月份的时候参加了光电设计大赛,我们小队使用的就是stm32的智能送餐小车,虽然止步于省赛,但是还是一次成长的经验吧,那…

在IntelliJ IDEA中使用Git推送项目

去gitee网站注册用户 gitee网站地址:https://gitee.com/ github网站地址:https://github.com/ 一、创建仓库 以下以gitee为例进行介绍,github操作雷同。 1、创建仓库 点击页面右上方的"“并选择"创建仓库” 2、设置仓库相关信息 首先输入仓库名&…

时序预测|基于PO-TCN-BiGRU的数据单变量和多变量时序预测Matlab程序 含基础模型对比TCN-BiGRU

时序预测|基于PO-TCN-BiGRU的数据单变量和多变量时序预测Matlab程序 含基础模型对比TCN-BiGRU 文章目录 前言时序预测|基于PO-TCN-BiGRU的数据单变量和多变量时序预测Matlab程序 含基础模型对比TCN-BiGRU 一、PO-TCN-BiGRU模型1. 时间卷积网络 (TCN)2. 双向门控循环单元 (BiGRU…

Modbus-RTU使用过程中的问题

此程序是在visual studio 2005的MFC程序中执行的,通过引入ModbusRTU.dll进行程序的编程,通过Dependency Walker工具查看ModbusRTU.dll中的静态函数如下: 在ModbusRTU.h文件中 MOD_API WORD RTUReadDiscreteInputs(BYTE nSlaveAddress, WORD …

接口自动化测试,介入时间以及整个流程规范是怎样的?

最近,小编身边有人提出一个问题: 背景 公司的接口自动化是从开发提测的时候开始用例设计开发的(因为我们公司没有接口文档,只能等开发完成后自己抓包),也就是接口自动化开发和功能测试是同时进行的&#…

Ubuntu 基础使用

一、下载Vmware workstation 和ubuntu映像文件 二、安装虚拟机 三、安装完成之后打开程序,选择创建新的虚拟机 选择映射文件 编辑信息 这里尽量选择一个特定的位置 根据自己的要求设定 设置完成后等待自己安装不需要进行操作 出现登录页面表示安装成功 四、基本指令…

K8S系列——(一)、Ubuntu上安装Helm

在使用K8S搭建集群服务时,有时候需要用到Helm(一个用于Kubernetes应用管理的工具),下面是在Ubuntu上安装Helm的过程。 1.更新系统软件包列表 sudo apt-get update2.安装必要的依赖项 sudo apt-get install apt-transport-https…

怎么在网络攻击中屹立不倒

在当今蓬勃发展的网络游戏产业中,服务器安全无疑是企业生存与发展的基石。面对互联网环境中无处不在的DDoS(分布式拒绝服务)与CC(挑战碰撞)攻击威胁,游戏服务器的防御能力与高效处理能力显得尤为重要。相较…

11.2.0.4 RAC 节点1重做操作系统后如何复原

环境描述:Redhat7.9 11.2.0.4 RAC 双节点 实验背景 群里有大佬在交流RAC中1个节点操作系统坏了如何修复,故有了该实验。 在正常的生产环境当中,有时候会遇到主机磁盘以及其他硬件故障导致主机OS系统无法启动,或者OS系统本身故障…

C语言 | Leetcode C语言题解之第342题4的幂

题目: 题解: bool isPowerOfFour(int n) {return n > 0 && (n & (n - 1)) 0 && n % 3 1; }

Python3 第八十八课 -- AI 绘画

目录 一. 前言 二. Windows 环境安装 三. Civitai 介绍 一. 前言 本文我们将为大家介绍如何基于一些开源的库来搭建一套自己的 AI 作图工具。 需要使用的开源库为 Stable Diffusion web UI,它是基于 Gradio 库的 Stable Diffusion 浏览器界面 Stable Diffusio…

驾校预约学习系统--论文pf

TOC springboot373驾校预约学习系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域…

HP惠普暗影精灵3代OMEN 15-ce0xx,15-ce007TX,15-ce509TX原厂Win10.1803系统镜像

hp暗影精灵III代游戏本笔记本电脑,恢复出厂开箱状态原装出厂Windows10系统安装下载,带恢复重置还原 适用型号:15-ce0xx,15-ce000 15-CE001TX、15-CE002TX、15-CE003TX、15-CE004TX、 15-CE005TX、15-CE006TX、15-CE007TX、15-CE008TX、 15-C…

Azure DevOps Server 数据库日志已满,TF30042: The database is full

Contents 1. 问题描述2. 处理方式 2.1 系统备份2.2 收缩日志2.3 恢复模式2.4 日志增长无法控制 1. 问题描述 Azure DevOps Server 作为微软的软件开发管理平台产品,理所当然地使用了微软的数据库软件SQL Server。 在一个大型的开发团队中,Azure DevOps S…

TED: 1靶场复现【附代码】(权限提升)

靶机下载地址: Ted: 1 ~ VulnHubTed: 1, made by Avraham Cohen. Download & walkthrough links are available.https://www.vulnhub.com/entry/ted-1,327/ 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.59.0/24|grep -B 2 00:…

webrtc学习笔记1

WebRTC开发环境 配置vscode 安装插件 Prettier Code Formatter 使用 Prettier 来统一代码风格,当保存 HTML/CSS/JavaScript 文件时,它会自动调整代码格式。 Live Server:在本地开发环境中,实时重新加载(reload)页面。 第一个简…

python logger冗余日志处理

在for循环中创建logger日志,产生冗余日志 冗余日志 import logging import osdef create_directory_file(log_path):"""创建目录,如果目录不存在则创建目录。"""# 获取目录路径directory os.path.dirname(log_path)# 如…

希尔排序时间复杂度的计算

希尔排序时间复杂度的计算 希尔排序的时间复杂度估算: 外层循环: 外层循环的时间复杂度可以直接给出为: O(log2 n) 或者 O(log3 n) ,即 O(log n) 内层循环: 希尔排序时间复杂度不好计算,因为 gap 的取值…

中间件漏洞原理与复现大全【万字总结】

文章目录 IISHTTP.SYS远程代码执行漏洞(CVE-2015-1635)漏洞描述影响版本漏洞复现 IIS短文件之目录扫描1、概念3、应用场景:4、漏洞利用: IIS文件解析漏洞IIS 6 解析漏洞IIS 7 解析漏洞 IIS写权限漏洞简介条件漏洞复现 NginxNginx …

kali实用工具之nmap

Nmap是一款开源免费的网络发现和安全审计工具。它被用来快速扫描大型网络,包括主机探测与发现、开放的端口情况、操作系统与应用服务指纹识别及常见安全漏洞。它的图形化界面是Zenamp。 Nmap的功能包括:主机发现、端口扫描、版本侦测、操作系统侦测。 …