如何在频域中旋转图像?

2023-11-23

我听说应该可以对 jpeg 图像进行无损旋转。这意味着您可以在频域中进行旋转,而无需 IDCT。我尝试用谷歌搜索但没有找到任何东西。有人可以对此带来一些启发吗?

我所说的无损是指我不会在旋转中丢失任何附加信息。当然,这可能只有在旋转 90 度的倍数时才有可能。


You do not需要对图像进行 IDCT 才能无损旋转它(请注意,光栅图像的无损旋转仅适用于 90 度倍数的角度)。

以下步骤在 DCT 域中实现图像的转置:

  1. 转置每个 DCT 块的元素
  2. 转置每个 DCT 块的位置

我假设您已经可以执行以下操作:

  • 从 JPEG 图像中获取原始 DCT 系数(如果没有,请参见here)
  • 将系数写回文件(如果要保存旋转图像)

我无法向您展示完整的代码,因为它非常复杂,但这是我对图像进行 IDCT 的部分(注意 IDCT 用于仅用于显示目的):

Size s = coeff.size();
Mat result = cv::Mat::zeros(s.height, s.width, CV_8UC1);

for (int i = 0; i < s.height - DCTSIZE + 1; i += DCTSIZE)
for (int j = 0; j < s.width  - DCTSIZE + 1; j += DCTSIZE)
{
    Rect rect = Rect(j, i, DCTSIZE, DCTSIZE);
    Mat dct_block = cv::Mat::Mat(coeff, rect);
    idct_step(dct_block, i/DCTSIZE, j/DCTSIZE, result);
}

这是显示的图像:

Lenna

这里没有发生任何奇特的事情——这只是原始图像。

现在,这是实现的代码both我上面提到的转置步骤:

Size s = coeff.size();
Mat result = cv::Mat::zeros(s.height, s.width, CV_8UC1);

for (int i = 0; i < s.height - DCTSIZE + 1; i += DCTSIZE)
for (int j = 0; j < s.width  - DCTSIZE + 1; j += DCTSIZE)
{
    Rect rect = Rect(j, i, DCTSIZE, DCTSIZE);
    Mat dct_block = cv::Mat::Mat(coeff, rect);
    Mat dct_bt(cv::Size(DCTSIZE, DCTSIZE), coeff.type());
    cv::transpose(dct_block, dct_bt);                // First transposition
    idct_step(dct_bt, j/DCTSIZE, i/DCTSIZE, result); // Second transposition, swap i and j
}

这是生成的图像:

transposed

您可以看到图像现在已转置。为了实现正确的旋转,您需要结合反射与转置。

EDIT

抱歉,我忘记了反射也不是微不足道的。它也包含两个步骤:

  1. 显然,反映了每个DCT块在所需轴上的位置
  2. 不太明显的是,反转(乘以-1)每个奇数行OR列于eachDCT 块。如果垂直翻转,则反转奇数rows。如果水平翻转,则反转奇数columns.

下面的代码在转置后执行垂直反射。

for (int i = 0; i < s.height - DCTSIZE + 1; i += DCTSIZE)
for (int j = 0; j < s.width  - DCTSIZE + 1; j += DCTSIZE)
{
    Rect rect = Rect(j, i, DCTSIZE, DCTSIZE);
    Mat dct_block = cv::Mat::Mat(coeff, rect);

    Mat dct_bt(cv::Size(DCTSIZE, DCTSIZE), coeff.type());
    cv::transpose(dct_block, dct_bt);

    // This is the less obvious part of the reflection.
    Mat dct_flip = dct_bt.clone();
    for (int k = 1; k < DCTSIZE; k += 2)
    for (int l = 0; l < DCTSIZE; ++l)
        dct_flip.at<double>(k, l) *= -1;

    // This is the more obvious part of the reflection.
    idct_step(dct_flip, (s.width - j - DCTSIZE)/DCTSIZE, i/DCTSIZE, result);
}

这是您得到的图像:

final

您会注意到,这相当于逆时针旋转 90 度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在频域中旋转图像? 的相关文章

  • 预测测试图像时出现错误 - 无法重塑大小数组

    我正在尝试使用 TensorFlow 和 Keras 在 Python 中进行图像识别 并且我已经关注了下面的博客 https stackabuse com image recognition in python with tensorfl
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 照片马赛克算法。如何在给定基本图像和瓷砖列表的情况下创建马赛克照片?

    Hy 我要做的是创建一个程序 使用 C 或 C 它将 24 位 像素位图和图像集合作为输入 我必须创建一个马赛克图像 类似于使用库的输入图像给定的图像 创建与输入类似的马赛克照片 到目前为止 我可以访问输入的图像像素及其颜色 但我有点卡住了
  • JPEG 中的颜色配置文件检测

    我希望能够检测 JPEG 中是否存在颜色配置文件 需要明确的是 我对实际进行颜色校正或用它们做任何其他事情不感兴趣 我做了一些调查 但找不到任何明确的信息来源 到目前为止我所知道的是 里面有一个颜色配置信息XMP块 XMP 块位于0xFFE
  • 如何选择面积最大的对象?

    我用过bwconvhull检测图像的某个部分 正如您在图像中看到的那样 有许多具有特定质心的对象 我想做的是检测面积最大的物体 左起第一个大物体 并忽略其他物体 我应该遵循哪种方法 我将非常感谢您的帮助 以下是代码 由于我仍在努力 所以写得
  • 如何使用网格分割图像并保留透明度边界框

    我有一些 png 图像 我想将其分成几个部分 例如按网格或大小 但每个部分应具有与原始图像相同的边界框 透明度 Example 将图像分成两部分 原来的 200 89 Output 部分 1 png 200 89 第2部分 png 200
  • 在 Matlab 中保存 Kinect 深度图像?

    通过使用 Kinect 我可以获得深度图像 其中每个深度图像像素存储相机和物体之间的距离 以毫米为单位 现在我想保存它们以便以后使用 最好的推荐是什么 我正在考虑将深度图像保存为图像 jpg png等 然而 该值通常是从50毫米到10000
  • 安卓的限制

    我需要构建一个应用程序 该应用程序拍摄相机图像并将其上传到网络 在网络上进行一些处理并返回真 假 我在这方面遇到了一些问题 希望得到澄清 1 我的应用程序有什么方法可以知道 Android 相机捕获的图像吗 我从这里明白了什么 Androi
  • 探索java图像处理的好资源[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是图像处理领域的新手 请推荐一些好的资源 书籍和网络链接 来学习 Java 中的图像处理 最适合隐写术分析 适合初学者和高级水平 我看过
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • pytesseract 无法从图像中识别复杂的数学公式

    我在用pytesseractpython 中的模块 pytesseract从图像中识别文本 但它不适用于包含复杂数学公式 例如根 推导 积分数学问题或方程 的图像 代码2 py Import modules from PIL import
  • 如何使用 javascript/ASP.NET/CSS 旋转和淡入淡出背景图像

    我需要随机淡入淡出背景图像 这将是一个定时函数 例如每 5 秒一次 我需要使用 ASP NET Javascript CSS 或全部三者来完成此操作 请大家帮帮我 谢谢 Cycle 一个 jQuery 插件 是一个非常灵活的图像旋转解决方案
  • PHP - 调整 PNG 图像大小时出现内存错误

    我有一个脚本可以根据上传的图像创建缩略图 它对 jpg 工作正常 但给我一个错误 致命错误 允许的内存大小 67108864 字节已耗尽 尝试分配 26250000 字节 当我上传 png 图像时 脚本是 create thumbnail
  • 如何用 JavaScript 修复图像透视变形和旋转?

    我有一些用手机拍摄的图像 有没有可以拉直纸张照片并将其压平的 JavaScript 库 例如 我想创建一个矩形图像 该图像没有任何失真 换句话说我想知道如何用 JavaScript 修复透视变形和旋转 例如 我发现下面的示例图像来自this
  • Python绕相机轴旋转图像

    假设我有一个图像 是在对某些原始图像应用单应性变换 H 后获得的 未显示原始图像 将单应性 H 应用于原始图像的结果是该图像 我想围绕合适的轴 可能是相机所在的位置 如果有的话 将此图像旋转 30 度以获得此图像 如果我不知道相机参数 如何
  • Pytorch TypeError:eq() 收到无效的参数组合

    num samples 10 def predict x sampled models guide None None for in range num samples yhats model x data for model in sam
  • 如何从一个清晰的例子计算二维图像中的吉布斯能量

    我有一个关于矩阵的有趣问题 在吉布斯分布中 吉布斯能量U x 可以计算为 这是所有可能的派系 C 上的派系势 Vc x 的总和 右图 团 c 被定义为 S 中站点的子集 x 蓝色像素的邻域是左图中黄色像素的邻居 其中每对不同的站点都是邻居
  • 如何将 Emgu.Cv.Image 转换为 System.Image

    我是 Emgu Cv 的新手 我想知道是否有人可以让我知道如何将 Emgu Cv Image 更改为 System Image 如果需要进一步解释 请告诉我 我会这样做 我的语言我使用的是C 你可以只使用ToImage 方法得到一个Syst

随机推荐