【opencv】教程代码 —photo

  • 将彩色图像转换为去色图像(灰度图像)和 颜色增强图像

  • HDR 图像合成,并同时执行色调映射和曝光融合

  • 非真实感渲染(NPR)

  • 正常克隆、混合克隆、单色传递、局部颜色改变、局部照明改变和纹理平滑

1. decolorization将彩色图像转换为去色图像(灰度图像)和 颜色增强图像

4ad518bbcd4403e24e60cac476622b1e.png

本段代码的功能是使用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); // 等待用户按键
}

c47895f37b894a2efce223c9437a0fdb.png

2. hdr_imaging.cpp  HDR 图像合成,并同时执行色调映射和曝光融合

cb15b034cfbc1dbb7fb0e7161d23a338.png

memorial.png

20dbeaeb3dd317b9856376ce5ddf85ba.png

fusion.png

0935854728f730737c2ba092fe67fad0.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();
}

14d1114ba69644fad9b4935aa8e71b9b.png

3. npr_demo.cpp非真实感渲染(NPR)

c7b996966b413d59b7034f7a84d71057.png

 Using Normalized convolution Filter

1d198a0c6eeaf6ab08263e61a4e0f47d.png

Using Recursive Filter

9cb63bda6a7d9d8c99fff42c0ed61590.png

Detail Enhancement

d8585bcfe33c87ca993aa5e1e4fd7e36.png

Pencil sketch/Color Pencil Drawing

f139f7dc3bf3cc2c97387d781d1dec76.png

 Stylization

  • cv::edgePreservingFilter():用于边缘保留平滑处理的函数,输入参数为源图像和目标图像,以及处理方式。

  • cv::detailEnhance():用于细节增强的函数,输入参数为源图像和目标图像。

  • cv::pencilSketch():用于铅笔素描处理的函数,输入参数包括源图像、两个目标图像和其他效果参数。

  • cv::stylization():用于风格化处理的函数,输入参数为源图像和目标图像。

该代码是一个使用OpenCV库进行非真实感渲染(NPR)的示例程序,包括以下几种处理方式:

  1. 边缘保留平滑:基于标准化卷积滤波器或递归滤波器。

  2. 细节增强:强调图像中的细节。

  3. 铅笔素描/彩色铅笔画:将图像转化为铅笔素描或彩色铅笔画样式。

  4. 风格化:对图像进行风格化处理。
    用户可以通过输入对应的数字来选择相应的处理方式。

/*
* npr_demo.cpp
*
* 作者:
* Siddharth Kherada <siddharthkherada27[at]gmail[dot]com>
*
* 这个教程展示了如何使用OpenCV非真实感渲染模块。
* 1)边缘保留平滑
*    -> 使用标准化卷积过滤器
*    -> 使用递归过滤器
* 2&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值