作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

void log(InputArray src, OutputArray dst);

参数说明

  1. InputArray类型的src,输入图像,如Mat类型。
  2. OutputArray类型的dst,输出的对数化图像。

测试代码

#include<iostream>
#include<opencv2/opencv.hpp>
#include<ctime>
using namespace std;
using namespace cv;void fftshift(cv::Mat &plane0, cv::Mat &plane1);int main(void)
{Mat test = imread("test.jpg", 0);test.convertTo(test, CV_32FC1);//创建通道,存储dft后的实部与虚部(CV_32F,必须为单通道数)cv::Mat plane[] = { test.clone(), cv::Mat::zeros(test.size() , CV_32FC1) };cv::Mat complexIm;cv::merge(plane, 2, complexIm); // 合并通道 (把两个矩阵合并为一个2通道的Mat类容器)cv::dft(complexIm, complexIm, 0); // 进行傅立叶变换,结果保存在自身// 分离通道(数组分离)cv::split(complexIm, plane);// 以下的操作是频域迁移fftshift(plane[0], plane[1]);// 计算幅值cv::Mat mag,mag_log,mag_nor,mag_log_nor;cv::magnitude(plane[0], plane[1], mag);// 幅值对数化:log(1+m),便于观察频谱信息mag += Scalar::all(1);cv::log(mag, mag_log);cv::normalize(mag, mag_nor, 1,0, NORM_MINMAX);cv::normalize(mag_log, mag_log_nor, 1, 0, NORM_MINMAX);cv::Mat BLUR;// 再次搬移回来进行逆变换fftshift(plane[0], plane[1]);cv::merge(plane, 2, BLUR); // 实部与虚部合并cv::idft(BLUR, BLUR);       // idft结果也为复数BLUR = BLUR / BLUR.rows / BLUR.cols;cv::split(BLUR, plane);//分离通道,主要获取通道imshow("original", test / 255);imshow("result", plane[0] / 255);waitKey(0);system("pause");return 0;
}// fft变换后进行频谱搬移
void fftshift(cv::Mat &plane0, cv::Mat &plane1)
{// 以下的操作是移动图像  (零频移到中心)int cx = plane0.cols / 2;int cy = plane0.rows / 2;cv::Mat part1_r(plane0, cv::Rect(0, 0, cx, cy));  // 元素坐标表示为(cx, cy)cv::Mat part2_r(plane0, cv::Rect(cx, 0, cx, cy));cv::Mat part3_r(plane0, cv::Rect(0, cy, cx, cy));cv::Mat part4_r(plane0, cv::Rect(cx, cy, cx, cy));cv::Mat temp;part1_r.copyTo(temp);  //左上与右下交换位置(实部)part4_r.copyTo(part1_r);temp.copyTo(part4_r);part2_r.copyTo(temp);  //右上与左下交换位置(实部)part3_r.copyTo(part2_r);temp.copyTo(part3_r);cv::Mat part1_i(plane1, cv::Rect(0, 0, cx, cy));  //元素坐标(cx,cy)cv::Mat part2_i(plane1, cv::Rect(cx, 0, cx, cy));cv::Mat part3_i(plane1, cv::Rect(0, cy, cx, cy));cv::Mat part4_i(plane1, cv::Rect(cx, cy, cx, cy));part1_i.copyTo(temp);  //左上与右下交换位置(虚部)part4_i.copyTo(part1_i);temp.copyTo(part4_i);part2_i.copyTo(temp);  //右上与左下交换位置(虚部)part3_i.copyTo(part2_i);temp.copyTo(part3_i);
}

测试效果

图1 未对数处理

图2 对数处理

从上图可以看出,未对数处理的图像几乎看不出什么规律,这是因为频谱信息中数据变化非常大,对数化是为了让数值的剧烈变化变得平滑,进而便于观察数据的规律和隐藏的信息。

log对数化是图像处理常用的操作哦~

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

OpenCV-计算自然对数cv::log相关推荐

  1. OpenCV入门系列 —— cv::minEnclosingCircle 随机生成点坐标并计算最小包围圆

    OpenCV入门系列 -- cv::minEnclosingCircle 随机生成点坐标并计算最小包围圆 前言 程序说明 输出结果 代码示例 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3 ...

  2. OpenCV - 计算相机和视频的帧速率FPS

    原文:OpenCV - 计算相机和视频的帧速率FPS[译] - AIUAI 原文:How to find frame rate or frames per second (fps) in OpenCV ...

  3. python求自然对数_计算自然对数的算法

    引言 我们知道,对数函数 ln(x) 可以展开为泰勒级数: 但是下面这个泰勒级数展开式收敛得更快: 经过简单计算可知上式中 y = (x - 1) / (x + 1) . 实现该算法的 C# 程序 根 ...

  4. 为什么OpenCV计算的帧率是错误的?

     点击上方"LiveVideoStack"关注我们 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 作者:王伟 编辑:Alex   引 言   我们有一个平台来周期性 ...

  5. Python中用于计算对数的log()方法

    本文转载至:http://www.jb51.net/article/66130.htm 这篇文章主要介绍了Python中用于计算对数的log()方法,是Python入门基础中的必会的方法,需要的朋友可 ...

  6. 基本矩阵 双目 matlab,MATLAB双目标定与OpenCV计算矫正参数矩阵

    Intrinsic parameters of left camera: Focal Length: fc_left = [ 320.53138 321.62046 ] ?[ 1.32444 1.28 ...

  7. 使用Python、OpenCV计算轮廓的中心

    1. 使用Python.OpenCV计算轮廓的中心并标记 2. 使用Python.OpenCV检测轮廓的形状并标记 3. 使用颜色通道统计信息来标记形状的实际颜色并标记 本博客的目标:(1)检测图像中 ...

  8. 使用Python,OpenCV计算图像直方图(cv2.calcHist)

    使用Python,OpenCV计算图像直方图(cv2.calcHist 1. 效果图 2. 原理 2.1 什么是图像直方图? 2.2 计算直方图 2.3 可视化蒙版区域 3. 源码 参考 这篇博客将介 ...

  9. OpenCV计算时刻calculate moments的实例(附完整代码)

    OpenCV计算时刻calculate moments的实例 OpenCV计算时刻calculate moments的实例 OpenCV计算时刻calculate moments的实例 #includ ...

最新文章

  1. 微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)
  2. 在VB.NET中应用SQLDMO
  3. 面板——卡片面板、常规折叠面板、手风琴折叠
  4. spring事务模板使用
  5. 数组的升序 java_java – 以升序数组排序数组
  6. vi是linux文本界面编辑器吗,LINUX初学之文本编辑器(vi ,vim)
  7. android FD泄露问题记录
  8. 支付宝当面付_没有营业执照也能开支付宝当面付啦
  9. Docker 启动tomcat报错Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use.
  10. 教你怎样激励自己做好每一件事
  11. 基于YOLOv7的室内场景智能识别系统(源码&教程)
  12. Python中的打包与解包
  13. 实体中list属性为空或者null,设置为空数组
  14. 机器人 零境交错吧_电击文库零境交错角色培养攻略 角色培养方法详解
  15. EasyExcel根据模板导出动态修改sheet名称
  16. Oracle 11g 数据库 实验7 数据库安全管理
  17. 公司没大牛带,需要离职么?
  18. 基于AndroidJava的食谱菜谱菜品APP设计
  19. Html5超链接设置提示信息
  20. 常见的安全问题及其相应解决方法

热门文章

  1. FAQ宝典之Rancher Server
  2. Hyper-V 3.0网络虚拟化PART 3:内部交换机
  3. MySQL主从同步相关-主从多久的延迟?
  4. 共享内存之——system V共享内存
  5. centos6.2系统下安装配置FastDFS步骤
  6. 5-1 duck typing的概念
  7. stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全
  8. python3 多线程 threading.local 代理_threading.local的作用?Python每日3题(多线程专题)...
  9. java语言cd_java语言
  10. 计算机一级笔试2012,2012计算机一级笔试模拟试卷及答案