zoukankan      html  css  js  c++  java
  • 使用OpenCV实现卡通画效果

    一、卡通画基本步骤  

    1.边缘检测,并保留边缘检测的图像
    2.将输入图像和边缘检测图像转换为32位浮点图像
    3.将转换后的输入图像和边缘检测图像相乘(两图合并),合并后重新转换为CV_8UC3
    4.输出最终的结果

    二、源代码演示

    /**
     * 实现卡通画效果
     * 步骤:
     * 1.边缘检测,并保留边缘检测的图像
     * 2.将输入图像和边缘检测图像转换为32位浮点图像
     * 3.将转换后的输入图像和边缘检测图像相乘(两图合并),合并后重新转换为CV_8UC3
     * 4.输出最终的结果
     *
     * ps:为了达到较好的效果,可以调整边缘检测的阈值,或者执行扩张的自定义形状的卷积核的大小
     * @param inputImagePath
     */
    void showCartoonImage(char *inputImagePath) {
        //加载原图
        Mat src = imread(inputImagePath);
        //给图片应用高斯模糊(主要是为了去除自然界的噪声)
        Mat imgMedian;
        //高斯模糊啊
        medianBlur(src, imgMedian, 7);
        //执行边缘检测
        Mat imgCanny;
        //此处阈值可以尝试用50~150
        Canny(imgMedian, imgCanny, 120, 130);
        //执行扩张,这里的卷积核也可以自行调整试试看比如:放到到1~5
        Mat kernel = getStructuringElement(MORPH_RECT, Size(1, 1));//定义一个2x2的卷积核
        //使用扩张来链接断开的边缘
        dilate(imgCanny, imgCanny, kernel);
        //
        imgCanny = imgCanny / 255;
        imgCanny = 1 - imgCanny;
        //转换为32位浮点数
        Mat imgCannyF;
        imgCanny.convertTo(imgCannyF, CV_32FC3);
        //中值模糊
        blur(imgCannyF, imgCannyF, Size(3, 3));
        //执行金字塔双边滤波,用于降噪、平滑、保持边缘
        Mat imgBF;
        bilateralFilter(src, imgBF, 9, 150.0, 150.0);
        //
        Mat result = imgBF / 25;
        result = result * 25;
        //
        Mat imgCanny3c;
        Mat cannyChannels[] = {imgCannyF, imgCannyF, imgCannyF};
        merge(cannyChannels, 3, imgCanny3c);
        //转为为32位浮点
        Mat resultF;
        result.convertTo(resultF, CV_32FC3);
        //相乘
        multiply(resultF, imgCanny3c, resultF);
        //将32位重新转为8位
        resultF.convertTo(result, CV_8UC3);
        //展示图片
        //原图
        imshow("src", src);
        //卡通画效果
        imshow("cartoon", result);
        waitKey(0);
    
    }

    三、对比图片展示

  • 相关阅读:
    Hibernate save, saveOrUpdate, persist, merge, update 区别
    Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
    Neo4j批量插入(Batch Insertion)
    嵌入式(Embedded)Neo4j数据库访问方法
    Neo4j 查询已经创建的索引与约束
    Neo4j 两种索引Legacy Index与Schema Index区别
    spring data jpa hibernate jpa 三者之间的关系
    maven web project打包为war包,目录结构的变化
    创建一个maven web project
    Linux下部署solrCloud
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/14842623.html
Copyright © 2011-2022 走看看