// 对数变换.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//基于源图像的方法1
Mat logTransform1(Mat srcImage, int c)
{
if (srcImage.empty())
cout << "No data" << endl;
Mat resultImage = Mat::zeros(srcImage.size(), srcImage.type());
add(srcImage, Scalar(1.0), srcImage); //计算 r+1
srcImage.convertTo(srcImage, CV_32F); //转化为32位浮点型
log(srcImage, resultImage); //计算log(1+r)
resultImage = c * resultImage;
//归一化处理
normalize(resultImage, resultImage, 0, 255, NORM_MINMAX);
convertScaleAbs(resultImage, resultImage);
return resultImage;
}
//方法2
Mat logTransform2(Mat srcImage, float c)
{
if (srcImage.empty())
cout << "No data" << endl;
Mat resultImage = Mat::zeros(srcImage.size(), srcImage.type());
double gray = 0;
for (int i = 0; i < srcImage.rows; i++)
{
for (int j = 0; j < srcImage.cols; j++)
{
gray = (double)srcImage.at<uchar>(i, j);
gray = c * log((double)(1 + gray));
resultImage.at<uchar>(i, j) = saturate_cast<uchar>(gray);
}
}
//归一化处理
normalize(resultImage, resultImage, 0, 255, NORM_MINMAX);
convertScaleAbs(resultImage, resultImage);
return resultImage;
}
//方法3
Mat logTransform3(Mat srcImage, float c)
{
if (srcImage.empty())
cout << "No data" << endl;
Mat resultImage = Mat::zeros(srcImage.size(), srcImage.type());
srcImage.convertTo(resultImage, CV_32F); //图像类型转换
resultImage = resultImage + 1; //图像矩阵元素加1
log(resultImage, resultImage);
resultImage = c * resultImage;
//归一化处理
normalize(resultImage, resultImage, 0, 255, NORM_MINMAX);
convertScaleAbs(resultImage, resultImage);
return resultImage;
}
int main()
{
//Mat srcImage = imread("D:\\1.jpg");
Mat srcImage = imread("C:\\Users\\Administrator\\Desktop\\Pic\\Most.png");
if (!srcImage.data)
return -1;
imshow("srcImage", srcImage);
float c = 1.5;
Mat resultImage;
double tTime;
tTime = (double)getTickCount();
const int nTimes = 100;
for (int i = 0; i < nTimes; i++)
{
resultImage = logTransform3(srcImage, c);
}
tTime = 1000 * ((double)getTickCount() - tTime) / getTickFrequency();
tTime /= nTimes;
cout << tTime << endl;
imshow("resultImage", resultImage);
waitKey(0);
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
Log convert.zip (28个子文件)
对数变换
.vs
对数变换
v15
Browse.VC.db 18.16MB
.suo 24KB
ipch
91c7542ae1c7e758.ipch 3.5MB
4299e65545368dd1.ipch 3.44MB
对数变换.sln 1KB
x64
Debug
对数变换.exe 90KB
对数变换.pdb 732KB
对数变换.ilk 782KB
对数变换
stdafx.cpp 310B
stdafx.h 366B
对数变换.vcxproj 8KB
targetver.h 370B
对数变换.vcxproj.filters 1KB
对数变换.cpp 5KB
对数变换.vcxproj.user 165B
x64
Debug
对数变换.pch 2.88MB
stdafx.obj 6KB
对数变换.obj 183KB
vc141.idb 235KB
对数变换.log 915B
对数变换.tlog
CL.write.1.tlog 1KB
CL.read.1.tlog 18KB
CL.command.1.tlog 2KB
link.write.1.tlog 636B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
对数变换.lastbuildstate 222B
vc141.pdb 732KB
共 28 条
- 1
周楷雯
- 粉丝: 78
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab开发的全面详解LTE:MATLAB建模、仿真与实现-simulink.rar
- 自动驾驶定位系列教程二:系统架构.pdf
- 整站程序8优技巧网-8ujq.rar
- 世界各个国家或地区国际域名缩写
- 基于matlab开发的根据rvm回归模型自己编的matlab程序.rar
- 基于matlab开发的该程序为国内一所大学编写的LTE链路层仿真程序,根据LTE标准协议编写的,很容易看懂.rar
- 高效C++学生成绩管理系统:教育技术+C++17编程+数据管理+教务自动化
- 搜索链接要广告分类系统 v2.0-yad20.rar
- 基于matlab开发的Tipping的相关向量机RVM的回归MATLAB程序,有英文注释,可以运行.rar
- 一个点击正反转程序实例,可实现案件电机正反转
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0