【opencv】示例-npr_demo.cpp 非真实感渲染:边缘保留平滑、细节增强、铅笔素描/彩色铅笔绘图和风格化处理...

Edge Preserve Smoothing- Using Normalized convolution Filter

Edge Preserve Smoothing-Using Recursive Filter

Detail Enhancement

Pencil sketch/Color Pencil Drawing

Stylization

cpp 复制代码
/*
* npr_demo.cpp
*
* 作者:
* Siddharth Kherada <siddharthkherada27[at]gmail[dot]com>
*
* 这个教程展示了如何使用OpenCV非真实感渲染模块。
* 1) 保边平滑处理
*    -> 使用归一化卷积滤波器
*    -> 使用递归滤波器
* 2) 细节增强
* 3) 铅笔素描/彩色铅笔绘图
* 4) 风格化
*
*/


#include <signal.h> // 导入signal信号处理库
#include "opencv2/photo.hpp" // 导入OpenCV非真实感渲染模块头文件
#include "opencv2/imgproc.hpp" // 导入OpenCV图像处理模块头文件
#include "opencv2/imgcodecs.hpp" // 导入OpenCV图像编解码模块头文件
#include "opencv2/highgui.hpp" // 导入OpenCV用户界面模块头文件
#include "opencv2/core.hpp" // 导入OpenCV核心功能模块头文件
#include <iostream> // 导入输入输出流库
#include <stdlib.h> // 导入标准库,包含一些基本功能


using namespace std; // 使用std命名空间
using namespace cv; // 使用cv命名空间(OpenCV功能)


int main(int argc, char* argv[]) // 主函数入口,传入命令行参数
{
    // 命令行解析器,可以处理传入的参数
    cv::CommandLineParser parser(argc, argv, "{help h||show help message}{@image|lena.jpg|input image}");
    if (parser.has("help")) // 如果输入了help参数
    {
        parser.printMessage(); // 打印帮助信息
        return 0; // 终止程序
    }
    // 获取输入的图像文件名
    string filename = samples::findFile(parser.get<string>("@image"));


    // 读取图像文件
    Mat I = imread(filename);


    // 用于用户选择的变量
    int num,type;


    if(I.empty()) // 如果图像为空,则文件未找到
    {
        cout <<  "Image not found" << endl; // 输出图像未找到信息
        return 1; // 终止程序
    }


    // 以下是用于展示的信息提示
    cout << endl;
    cout << " Edge Preserve Filter" << endl;
    cout << "----------------------" << endl;


    cout << "Options: " << endl;
    cout << endl;


    cout << "1) Edge Preserve Smoothing" << endl;
    cout << "   -> Using Normalized convolution Filter" << endl;
    cout << "   -> Using Recursive Filter" << endl;
    cout << "2) Detail Enhancement" << endl;
    cout << "3) Pencil sketch/Color Pencil Drawing" << endl;
    cout << "4) Stylization" << endl;
    cout << endl;


    cout << "Press number 1-4 to choose from above techniques: ";


    // 获取用户选择的处理技术编号
    cin >> num;


    // 创建一个Mat对象用于存放处理后的图像
    Mat img;


    // 根据用户选择的技术编号,调用不同的处理函数
    if(num == 1)
    {
        cout << endl;
        cout << "Press 1 for Normalized Convolution Filter and 2 for Recursive Filter: ";


        // 获取用户选择的滤波器类型
        cin >> type;


        // 执行保边平滑处理
        edgePreservingFilter(I,img,type);
        // 显示处理后的图像
        imshow("Edge Preserve Smoothing",img);


    }
    else if(num == 2)
    {
        // 执行细节增强处理
        detailEnhance(I,img);
        // 显示处理后的图像
        imshow("Detail Enhanced",img);
    }
    else if(num == 3)
    {
        // 创建一个Mat对象用于存放彩色素描图像
        Mat img1;
        // 执行铅笔素描/彩色铅笔绘图处理
        pencilSketch(I,img1, img, 10 , 0.1f, 0.03f);
        // 显示处理后的铅笔素描图像
        imshow("Pencil Sketch",img1);
        // 显示处理后的彩色铅笔绘图图像
        imshow("Color Pencil Sketch",img);
    }
    else if(num == 4)
    {
        // 执行风格化处理
        stylization(I,img);
        // 显示处理后的图像
        imshow("Stylization",img);
    }
    // 等待用户按键以便可以看到图像
    waitKey(0);
}

这段代码是一个OpenCV的非真实感渲染样例程序,功能包括保边平滑处理、细节增强、铅笔素描/彩色铅笔绘图以及风格化。用户可以通过命令行选择使用哪种处理技术,并可以通过终端的交互提示进行进一步的选择。处理后的图像将会显示在窗口中。

相关推荐
学好statistics和DS42 分钟前
【CV】神经网络中哪些参数需要被学习?
人工智能·神经网络·学习
大千AI助手43 分钟前
机器学习特征筛选中的IV值详解:原理、应用与实现
人工智能·机器学习·kl散度·roc·iv·信息值·woe
姜—姜1 小时前
通过构建神经网络实现项目预测
人工智能·pytorch·深度学习·神经网络
Ro Jace1 小时前
模式识别与机器学习课程笔记(4):线性判决函数
人工智能·笔记·机器学习
科研小白_2 小时前
基于遗传算法优化BP神经网络(GA-BP)的数据时序预测
人工智能·算法·回归
互联网江湖3 小时前
蓝桥杯出局,少儿编程的价值祛魅时刻?
人工智能·生活
Elastic 中国社区官方博客3 小时前
根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
paid槮4 小时前
OpenCV图像形态学详解
人工智能·opencv·计算机视觉
点控云4 小时前
点控云智能短信:重构企业与用户的连接,让品牌沟通更高效
大数据·人工智能·科技·重构·外呼系统·呼叫中心
救救孩子把7 小时前
14-机器学习与大模型开发数学教程-第1章 1-6 费马定理与极值判定
人工智能·数学·机器学习