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

server/2024/10/18 14:23:07/

目录

二七、离散余弦变换

执行离散余弦变换 (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中的几何变换函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像处理任务。


http://www.ppmy.cn/server/62286.html

相关文章

深层神经网络示例

维度说明: A[L]、Z[L]:(本层神经元个数、样本数) W[L]:(本层神经元个数、上层神经元个数) b[L]:(本层神经元个数、1) dZ[L]:dA[L] * g’A&#xf…

AI写作不懂提示词 大象Prompt 保姆级系列教程三

一、提示词的核心价值究竟是啥? 最近跟不少业内朋友探讨这事儿,我觉得:提示词的核心价值在于对方法论的封装以及由此带来的知识传播速度加快。 通俗讲,假如你熟悉的行业里有个厉害的“老师傅”,他在核心业务上有好多心…

五、 计算机网络(考点篇)

1 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物,它实现了远程通信、远程信息处理和资源共享。计算机网络的功能:数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标:速率、带宽(频带宽度或传送线路…

IPython %paste:剪贴板代码的快速执行秘籍

IPython %paste:剪贴板代码的快速执行秘籍 在编程和数据分析的过程中,经常需要从文档或网页中复制代码片段到IPython环境中执行。IPython的%paste魔术命令为此提供了一个便捷的解决方案。本文将详细介绍如何在IPython中使用%paste命令来执行剪贴板中的代…

嵌入式要卷成下一个Java了吗?

嵌入式系统与Java的关系在技术发展和市场需求的影响下在逐步演变,但尚未达到完全替代的阶段。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&…

十大排序 之 快速排序

!!!排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素base,利用base将待排序的序列分…

掌握Laravel环境配置:打造灵活多变的应用环境

掌握Laravel环境配置:打造灵活多变的应用环境 在现代Web应用开发中,环境配置管理是确保应用在不同环境(开发、测试、生产等)中表现一致的关键。Laravel框架提供了一套强大且灵活的环境配置管理系统,允许开发者根据不同…

JAVA23种设计模式简介

设计模式 设计模式的类型 创建型模式 隐藏了创建对象的过程,通过逻辑方法进行创建对象,而不是通过new关键字创建对象。 工厂方法模式 定义接口或一个抽象的工厂类,让它实现类(工厂)来决定创建哪一个实例对象。根据每…