将彩色图像转换为去色图像(灰度图像)和 颜色增强图像
HDR 图像合成,并同时执行色调映射和曝光融合
非真实感渲染(NPR)
正常克隆、混合克隆、单色传递、局部颜色改变、局部照明改变和纹理平滑
1. decolorization将彩色图像转换为去色图像(灰度图像)和 颜色增强图像
本段代码的功能是使用OpenCV的去色模块将输入的彩色图像转换为灰度图像和色彩提升图像,并显示这三种图像。程序首先解析命令行参数获取图像文件名,然后读取彩色图像。如果读取成功,则使用decolor
函数处理图像。最后,使用imshow
函数分别显示原始彩色图像、生成的灰度图像和色彩提升图像,并等待用户操作来结束程序
// 本教程展示了如何使用 OpenCV 去色模块。
//
// 输入:
// 彩色图像
//
// 输出:
// 1) 灰度图像
// 2) 色彩提升图像
//
#include "opencv2/photo.hpp" // 包含OpenCV中处理照片的相关功能的头文件
#include "opencv2/imgproc.hpp" // 包含OpenCV中图像处理的相关功能的头文件
#include "opencv2/highgui.hpp" // 包含OpenCV中高层GUI(图形用户界面)的相关功能的头文件
#include "opencv2/core.hpp" // 包含OpenCV中核心功能的头文件
#include <iostream> // 包含标准输入输出流库
using namespace std; // 使用标准命名空间
using namespace cv; // 使用OpenCV命名空间
int main( int argc, char *argv[] ) // 主函数,程序入口
{
// 解析命令行参数
CommandLineParser parser( argc, argv, "{@input | HappyFish.jpg | input image}" );
// 读取输入图像,使用命令行参数指定的文件名
Mat src = imread( samples::findFile( parser.get<String>( "@input" ) ), IMREAD_COLOR );
if ( src.empty() ) // 如果图像为空,即无法打开或找到图像
{
cout << "Could not open or find the image!\n" << endl; // 输出错误信息
cout << "Usage: " << argv[0] << " <Input image>" << endl; // 输出正确用法
return EXIT_FAILURE; // 返回失败状态码
}
Mat gray, color_boost; // 创建两个Mat对象,用于存放结果图像
decolor( src, gray, color_boost ); // 使用去色函数处理图像,得到灰度图像和色彩强化图像
imshow( "Source Image", src ); // 显示原始彩色图像
imshow( "grayscale", gray ); // 显示灰度图像
imshow( "color_boost", color_boost ); // 显示色彩提升图像
waitKey(0); // 等待用户按键
}
2. hdr_imaging.cpp HDR 图像合成,并同时执行色调映射和曝光融合
memorial.png
fusion.png
ldr.png
该段代码是一个完整的程序,用于 HDR 图像合成,并同时执行色调映射和曝光融合。程序首先通过命令行参数加载一系列不同曝光时间的图像,使用Debevec方法估算相机响应,然后生成HDR图像,对HDR图像进行色调映射以生成LDR图像,最后执行曝光融合来生成一个动态范围较宽的显示图像。程序把所有生成的结果以图像文件的形式写入到磁盘中。
#include "opencv2/photo.hpp" // 引入OpenCV中的photo模块,主要用于高动态范围和图像去噪
#include "opencv2/imgcodecs.hpp" // 引入OpenCV中的imgcodecs模块,提供图像文件读取和写入功能
#include "opencv2/highgui.hpp" // 引入OpenCV中的highgui模块,用于图像显示和简单用户界面
#include <vector> // 引入标准模板库中的vector容器
#include <iostream> // 引入标准输入输出流库
#include <fstream> // 引入文件流库
using namespace cv; // 使用OpenCV命名空间,方便后面直接调用其下的函数和类
using namespace std; // 使用标准命名空间
// 声明一个用于加载曝光时间序列的函数
void loadExposureSeq(String, vector<Mat>&, vector<float>&);
// 程序入口点
int main(int argc, char**argv)
{
// 解析命令行参数
CommandLineParser parser( argc, argv, "{@input | | Input directory that contains images and exposure times. }" );
// [加载图像和曝光时间]
vector<Mat> images; // 存储图像的向量
vector<float> times; // 存储曝光时间的向量
// 调用自定义函数loadExposureSeq加载图像和曝光时间
loadExposureSeq(parser.get<String>( "@input" ), images, times);
// [加载图像和曝光时间结束]
// [估算相机响应]
Mat response; // 创建一个Mat对象用于存放相机响应结果
// 创建Debevec的相机校正对象
Ptr<CalibrateDebevec> calibrate = createCalibrateDebevec();
// 使用calibrate对象的process方法处理图像和曝光时间,得到响应曲线
calibrate->process(images, response, times);
// [估算相机响应结束]
// [生成HDR图像]
Mat hdr; // 创建一个HDR图像的Mat对象
// 创建Debevec的HDR融合对象
Ptr<MergeDebevec> merge_debevec = createMergeDebevec();
// 使用merge_debevec对象的process方法合成HDR图像
merge_debevec->process(images, hdr, times, response);
// [生成HDR图像结束]
// [对HDR图像进行色调映射]
Mat ldr; // 创建一个LDR图像的Mat对象
Ptr<Tonemap> tonemap = createTonemap(2.2f); // 创建色调映射对象,gamma值为2.2
// 使用tonemap对象的process方法对HDR图像进行色调映射,得到LDR图像
tonemap->process(hdr, ldr);
// [对HDR图像进行色调映射结束]
// [执行曝光融合]
Mat fusion; // 创建一个融合结果的Mat对象
Ptr<MergeMertens> merge_mertens = createMergeMertens(); // 创建Mertens的曝光融合对象
// 使用merge_mertens对象的process方法对图像执行曝光融合
merge_mertens->process(images, fusion);
// [执行曝光融合结束]
// [写出结果]
imwrite("fusion.png", fusion * 255); // 将曝光融合的结果乘以255后写入文件fusion.png
imwrite("ldr.png", ldr * 255); // 将色调映射的结果乘以255后写入文件ldr.png
imwrite("hdr.hdr", hdr); // 将HDR图像写入文件hdr.hdr
// [写出结果结束]
// 程序正常退出
return 0;
}
// 定义之前声明的加载曝光时间序列函数
void loadExposureSeq(String path, vector<Mat>& images, vector<float>& times)
{
// 在路径后面添加斜杠
path = path + "/";
// 使用文件流打开path路径下的list.txt文件
ifstream list_file((path + "list.txt").c_str());
string name;
float val;
// 循环读取图像文件名和曝光值,直到文件结尾
while(list_file >> name >> val) {
// 读取图像并将其存入images向量
Mat img = imread(path + name);
images.push_back(img);
// 计算曝光时间并将其存入times向量
times.push_back(1 / val);
}
// 关闭文件
list_file.close();
}
3. npr_demo.cpp非真实感渲染(NPR)
Using Normalized convolution Filter
Using Recursive Filter
Detail Enhancement
Pencil sketch/Color Pencil Drawing
Stylization
cv::edgePreservingFilter()
:用于边缘保留平滑处理的函数,输入参数为源图像和目标图像,以及处理方式。cv::detailEnhance()
:用于细节增强的函数,输入参数为源图像和目标图像。cv::pencilSketch()
:用于铅笔素描处理的函数,输入参数包括源图像、两个目标图像和其他效果参数。cv::stylization()
:用于风格化处理的函数,输入参数为源图像和目标图像。
该代码是一个使用OpenCV库进行非真实感渲染(NPR)的示例程序,包括以下几种处理方式:
边缘保留平滑:基于标准化卷积滤波器或递归滤波器。
细节增强:强调图像中的细节。
铅笔素描/彩色铅笔画:将图像转化为铅笔素描或彩色铅笔画样式。
风格化:对图像进行风格化处理。
用户可以通过输入对应的数字来选择相应的处理方式。
/*
* npr_demo.cpp
*
* 作者:
* Siddharth Kherada <siddharthkherada27[at]gmail[dot]com>
*
* 这个教程展示了如何使用OpenCV非真实感渲染模块。
* 1)边缘保留平滑
* -> 使用标准化卷积过滤器
* -> 使用递归过滤器
* 2&#x