当前位置: 首页 > news >正文

opencv—常用函数学习_“干货“_10

目录

二七、离散余弦变换

执行离散余弦变换 (dct) 和逆变换 (idct)

解释

实际应用

JPEG压缩示例(简化版)

二八、图像几何变换

仿射变换 (warpAffine 和 getAffineTransform)

透视变换 (warpPerspective 和 getPerspectiveTransform)

旋转变换 (getRotationMatrix2D)

极坐标变换 (warpPolar 和 linearPolar)

http://t.csdnimg.cn/i8pqt —— opencv—常用函数学习_“干货“_总(VIP)

散的正在一部分一部分发,不需要VIP。

资料整理不易,有用话给个赞和收藏吧。


二七、离散余弦变换

        在OpenCV中,离散余弦变换(DCT)和其逆变换(IDCT)是常用于图像压缩和处理的技术。DCT将图像数据从时域转换到频域,而IDCT则是将数据从频域转换回时域。OpenCV提供了两个主要函数:dctidct

离散余弦变换函数
dctidct
执行离散余弦变换执行离散余弦逆变换

执行离散余弦变换 (dct) 和逆变换 (idct)
import cv2
import numpy as np# 读取图像并转换为灰度图
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 将图像转换为浮点型
image_float = np.float32(image) / 255.0# 执行离散余弦变换
dct_image = cv2.dct(image_float)# 显示DCT变换后的图像
cv2.imshow('DCT Image', dct_image)
cv2.waitKey(0)# 执行离散余弦逆变换
idct_image = cv2.idct(dct_image)# 将结果转换回0-255范围的图像
idct_image = np.uint8(idct_image * 255)# 显示逆变换后的图像
cv2.imshow('IDCT Image', idct_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

解释

  • dct函数:对输入图像进行离散余弦变换。该函数将图像数据从时域转换到频域,通常用于压缩算法,如JPEG压缩。
  • idct函数:对频域数据进行逆变换,恢复到时域。

实际应用

        离散余弦变换在图像压缩中有广泛的应用。例如,在JPEG压缩中,图像被分割成8x8的块,并对每个块执行DCT变换,然后进行量化处理。

JPEG压缩示例(简化版)
# 读取图像并转换为灰度图
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)
h, w = image.shape# 将图像转换为浮点型
image_float = np.float32(image) / 255.0# 分块处理(8x8)
block_size = 8
dct_blocks = np.zeros_like(image_float)# 执行DCT变换
for i in range(0, h, block_size):for j in range(0, w, block_size):block = image_float[i:i+block_size, j:j+block_size]dct_block = cv2.dct(block)dct_blocks[i:i+block_size, j:j+block_size] = dct_block# 显示DCT变换后的图像
cv2.imshow('DCT Blocks', dct_blocks)
cv2.waitKey(0)# 执行逆DCT变换
idct_blocks = np.zeros_like(dct_blocks)
for i in range(0, h, block_size):for j in range(0, w, block_size):block = dct_blocks[i:i+block_size, j:j+block_size]idct_block = cv2.idct(block)idct_blocks[i:i+block_size, j:j+block_size] = idct_block# 将结果转换回0-255范围的图像
idct_image = np.uint8(idct_blocks * 255)# 显示逆变换后的图像
cv2.imshow('IDCT Blocks', idct_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

        通过这些示例,可以看到如何使用OpenCV中的DCT和IDCT函数来进行离散余弦变换及其逆变换。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像处理和压缩任务。

二八、图像几何变换

        在OpenCV中,几何变换是图像处理中的基本操作,包括旋转、缩放、平移、透视变换等。下面介绍一些常用的几何变换函数及其使用示例。

图像几何变换函数
logPolarwarpPolarlinearPolargetAffineTransformwarpAffine
对图像进行对数极坐标变换对图像进行极坐标变换对图像进行线性极坐标变换计算仿射变换矩阵对图像进行仿射变换
invertAffineTransformgetPerspectiveTransformwarpPerspectivegetRotationMatrix2D
计算仿射变换矩阵的逆矩阵计算透视变换矩阵对图像进行透视变换计算二维旋转矩阵

仿射变换 (warpAffinegetAffineTransform)
import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg')# 获取图像尺寸
rows, cols, ch = image.shape# 定义三个点及其对应变换后的点
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])# 计算仿射变换矩阵
M = cv2.getAffineTransform(pts1, pts2)# 对图像进行仿射变换
dst = cv2.warpAffine(image, M, (cols, rows))cv2.imshow('Affine Transform', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
透视变换 (warpPerspectivegetPerspectiveTransform)
# 定义四个点及其对应变换后的点
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])# 计算透视变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2)# 对图像进行透视变换
dst = cv2.warpPerspective(image, M, (300, 300))cv2.imshow('Perspective Transform', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
旋转变换 (getRotationMatrix2D)
# 定义旋转中心、角度和缩放因子
center = (cols // 2, rows // 2)
angle = 45
scale = 1.0# 计算旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)# 对图像进行旋转变换
rotated = cv2.warpAffine(image, M, (cols, rows))cv2.imshow('Rotated Image', rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()
极坐标变换 (warpPolarlinearPolar)
# 极坐标变换
polar_image = cv2.warpPolar(image, (cols, rows), (cols//2, rows//2), max(cols, rows) // 2, cv2.WARP_FILL_OUTLIERS)# 对数极坐标变换
log_polar_image = cv2.logPolar(image, (cols//2, rows//2), 40, cv2.WARP_FILL_OUTLIERS)cv2.imshow('Polar Transform', polar_image)
cv2.imshow('Log Polar Transform', log_polar_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

        这些示例展示了如何使用OpenCV中的几何变换函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像处理任务。

相关文章:

opencv—常用函数学习_“干货“_10

目录 二七、离散余弦变换 执行离散余弦变换 (dct) 和逆变换 (idct) 解释 实际应用 JPEG压缩示例(简化版) 二八、图像几何变换 仿射变换 (warpAffine 和 getAffineTransform) 透视变换 (warpPerspective 和 getPerspectiveTransform) 旋转变换 (g…...

Jmeter二次开发Demo

Jmeter二次开发Demo 前言 在上一集,我们已经完成了JMX脚本的分析,大致了解了JMX脚本的基本元素。 那么在这一集,我们将会介绍一下Jmeter二次开发的Demo。 Demo代码 那么话不多说,我们就直接上代码。 public class TestStress…...

MongoDB综合实战篇(超容易)

一、题目引入 在MongoDB的gk集合里插入以下数据: 用语句完成如下功能: (1)查询张三同学的成绩信息 (2)查询李四同学的语文成绩 (3)查询没有选化学的同学 (4&#xf…...

框架设计MVVM

重点&#xff1a; 1.viewmodel 包含model 2.view包含viewmodel,通过驱动viewmodel去控制model的数据和业务逻辑 // Test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <vector>using namespace std;#p…...

RK3399基础部分

1.RK3399介绍 基础特性&#xff1a; 高达1.8GHz的双核Cortex-A72 四核Cortex-A53高达1.4GHz NPU高达3.0TOPS Mali-T860MP4 GPU 双通道DDR3/DDR3L/LPDDR3/LPDDR4 4K超高清H265/H264/VP9 HDR10/HLG H264编码器 双MIPI CSI和ISP USB Type-CGPU: 图形处理器&#xff08;英语&…...

linux高级编程(广播与组播)

广播与组播&#xff1a; 广播&#xff1a; 局域网&#xff0c;一个人发所有人都能收&#xff08;服务器找客户端&#xff09;&#xff0c;&#xff08;发给路由器的广播地址后后路由器自动给所有人发&#xff0c;可用于服务器找客户端&#xff09; 只能udp来做 setsocketopt…...

Andriod Stdio新建Kotlin的Jetpack Compose简单项目

1.选择 No Activity 2.选择kotlin 4.右键选择 在目录MyApplication下 New->Compose->Empty Project 出现下面的画面 Finish 完成...

Linux多线程编程-哲学家就餐问题详解与实现(C语言)

在哲学家就餐问题中&#xff0c;假设有五位哲学家围坐在圆桌前&#xff0c;每位哲学家需要进行思考和进餐两种活动。他们的思考不需要任何资源&#xff0c;但进餐需要使用两根筷子&#xff08;左右两侧各一根&#xff09;。筷子是共享资源&#xff0c;哲学家们在进行进餐时需要…...

从C向C++18——演讲比赛流程管理系统

一.项目需求 1.比赛规则 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共两轮&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛。每名选手都有对应的编号&#xff0c;如 10001~ 10012比赛方式&#xff1a;分组比赛&#xff0c;每组6个人&#xff1b;第一轮分为两…...

QThread和std::thread

在 Qt 中&#xff0c; 我们经常会用到多线程&#xff0c;这时候就需要纠结是使用 Qt 的 QThread 还是使用 C 标准库的 std::thread。 这里记录一下我自己的理解&#xff0c;先介绍一下 QThread 和 std::thread 的使用方法&#xff0c;对比一下他们的不同&#xff0c;最后说一下…...

LeetCode 算法:组合总和 c++

原题链接&#x1f517;&#xff1a;组合总和 难度&#xff1a;中等⭐️⭐️ 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 …...

【两大3D转换SDK对比】HOOPS Exchange VS. CAD Exchanger

在现代工业和工程设计领域&#xff0c;CAD数据转换工具是确保不同软件系统间数据互通的关键环节。HOOPS Exchange和CAD Exchanger是两款备受关注的工具&#xff0c;它们在功能、支持格式、性能和应用场景等方面有着显著差异。 本文将从背景、支持格式、功能和性能、应用场景等…...

Openerstry + lua + redis根据请求参数实现动态路由转发

文章目录 一、需求分析二、准备1、软件安装2、redis-lua封装优化 三、实现1、nginx.conf2、dynamic.lua注意 3、准备两个应用4、访问nginx 四、参数直接传要代理的地址端口 一、需求分析 根据用户访问url的参数&#xff0c;将请求转发到对应指定IP的服务器上。 二、准备 1、…...

数字名片-Pushmall 智能AI数字名片7月更新计划

[数字名片]-商务营销推广助手7月更新计划 数字名片-商务营销推广助手7月更新计划 **2024年 6月完成模块开发优化****实现SaaS框架业务 1、智能名片&#xff1a;创建个人名片、企业名片、商机管理。 2、人脉商圈&#xff1a;附近人脉、就近群脉、好友名片。 3、企微社群&…...

21. Python代码快速查看数组分布

1. 前言 当你已经具备一段可用于快速查看数组分布的Python代码时,你拥有了一项强大的工具来分析和理解你的数据集。这种类型的代码通常会使用可视化库,例如Matplotlib和Seaborn,以直观的方式展示数据分布。这些库允许你创建直方图以观察数据集中的频率分布,以及核密度估计…...

记录些Redis题集(3)

分布式锁 分布式锁是一种用于在分布式系统中实现互斥访问的机制&#xff0c;它可以确保在多个节点、或进程同时访问共享资源。如果没有适当的锁机制&#xff0c;就可能导致数据不一致或并发冲突的问题。 分布式锁需要的介质 需要一个多个微服务节点都能访问的存储介质&#…...

OracleLinux6.9升级UEK内核

方法一: [root@localhost ~]# uname -r 4.1.12-61.1.28.el6uek.x86_64 [root@localhost ~]# rpm -qa | grep kernel-uek kernel-uek-firmware-4.1.12-61.1.28.el6uek.noarch kernel-uek-4.1.12-61.1.28.el6uek.x86_64 [root@localhost ~]# yum list kernel-uek Loaded plug…...

React学习笔记03-----手动创建和运行

一、项目创建与运行【手动】 react-scripts集成了webpack、bable、提供测试服务器 1.目录结构 public是静态目录&#xff0c;提供可以供外部直接访问的文件&#xff0c;存放不需要webpack打包的文件&#xff0c;比如静态图片、CSS、JS src存放源码 &#xff08;1&#xff09…...

ubantu22.04安装OceanBase 数据库

1、管理员启动cmd,运行 sudo bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/service/installer.sh)" 2、提示如下代表安装完成 3、修改数据库配置文件的密码 sudo vim /etc/oceanbase.cnf 然后保存退…...

【linux】【深度学习】fairseq框架安装踩坑

直接pip install fairseq发现跑代码时候老是容易崩&#xff0c;所以选择用源码编译安装。 python环境选择3.8以上都行&#xff0c;我选择3.10 首先安装torch&#xff0c; 我选择安装pip install torch1.13.1 torchaudio0.13.1以及cuda 11.7 &#xff08;具体cuda根据个人显卡进…...

后端实战案例:企业级框架设计与优化实践

一、前言在 2026 年的软件开发中&#xff0c;Java 已经成为每一位工程师必须掌握的技能。无论是构建高性能后端服务、开发响应式前端界面&#xff0c;还是维护生产级服务器集群&#xff0c;这项技术都在其中扮演着关键角色。很多开发者在入门阶段会遇到一个普遍问题&#xff1a…...

Arduino超声波测距库:基于外部中断的非阻塞HC-SR04驱动

1. 项目概述iarduino_HC_SR04_int是一款专为 Arduino IDE 设计的超声波测距传感器驱动库&#xff0c;面向 HC-SR04 模块提供高精度、非阻塞式距离测量能力。该库并非简单封装pulseIn()的轮询实现&#xff0c;而是基于硬件级外部中断机制构建&#xff0c;从根本上解决了传统超声…...

告别默认丑标签!手把手教你用QGIS 3.28自定义地图标注(附Python脚本)

告别默认丑标签&#xff01;手把手教你用QGIS 3.28自定义地图标注&#xff08;附Python脚本&#xff09; 地图可视化不仅是数据的呈现&#xff0c;更是信息传达的艺术。当你精心准备的地理数据因为默认标签样式而显得平庸时&#xff0c;那种挫败感我深有体会——文字太小看不清…...

Ostrakon-VL 扫描终端嵌入式部署初探:在 STM32 生态下的轻量级应用

Ostrakon-VL 扫描终端嵌入式部署初探&#xff1a;在 STM32 生态下的轻量级应用 1. 嵌入式视觉的新机遇 在工业质检、智能零售和智慧农业等领域&#xff0c;越来越多的场景需要设备具备实时视觉理解能力。传统方案往往依赖高性能计算平台或云端处理&#xff0c;但在资源受限的…...

Phi-4-mini-reasoning vLLM模型服务化:gRPC接口与Protobuf定义详解

Phi-4-mini-reasoning vLLM模型服务化&#xff1a;gRPC接口与Protobuf定义详解 1. 模型概述 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理。作为Phi-4模型家族的一员&#xff0c;它特别针对数学推理能力进行了…...

Pixel Couplet Gen快速上手:三步完成像素春联生成器本地部署与微信小程序对接

Pixel Couplet Gen快速上手&#xff1a;三步完成像素春联生成器本地部署与微信小程序对接 1. 项目概览 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。通过ModelScope大模型驱动&#xff0c;它能够将用户输入的文字愿望转化为富有创意的像素风格…...

用CT001解读Type-C线材设计:为什么只有一个CC灯亮?

拿到POWER-Z CT001测试仪&#xff0c;很多用户第一次测试C to C线材时&#xff0c;都会产生一个疑问&#xff1a;为什么线材明明能正常充电&#xff0c;CT001上却只有一个CC指示灯亮起&#xff1f;另一个CC对应的位置始终不亮&#xff0c;是线材有问题吗&#xff1f; 答案很明确…...

基于S7-1200PLC的物业供水控制系统设计》 PLC触摸屏,图纸,博图16 一、设计任务书...

基于S7-1200PLC的物业供水控制系统设计》 PLC触摸屏&#xff0c;图纸&#xff0c;博图16 一、设计任务书 1.自动工作时&#xff0c;当用水量少&#xff0c;压力增高&#xff0c;K 接通&#xff0c;此时可延时30s后撤除1台水泵工作,要求先工作的水泵先切断;当用水量多时,压力降低…...

人事档案整理系统开发记录

档案整理系统开发记录 本篇文章&#xff0c;用于记录我个人开发档案整理工具的所有问题。 说明&#xff1a;开发该工具适用于人事档案处理工具&#xff0c;适用于档案处理&#xff0c;帮助档案整理人员更轻松的移交。 我会一步一步记录&#xff0c;整个软件开的所有的问题&…...

OpenClaw移动办公:Phi-3-mini-128k-instruct通过钉钉审批电子合同

OpenClaw移动办公&#xff1a;Phi-3-mini-128k-instruct通过钉钉审批电子合同 1. 为什么需要移动审批电子合同&#xff1f; 上周三我在高铁上收到法务同事的紧急消息&#xff1a;"有个供应商合同今天必须签完&#xff0c;但关键条款需要你确认"。当时手边既没电脑也…...