iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ opencv如何将图片动漫化
  • 292
分享到

C++ opencv如何将图片动漫化

2023-06-28 23:06:43 292人浏览 八月长安
摘要

这篇文章给大家分享的是有关c++ OpenCV如何将图片动漫化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近对图像处理十分感兴趣,也学着用opencv 实现各种简单的图像处理,因此,有了下面的实验,

这篇文章给大家分享的是有关c++ OpenCV如何将图片动漫化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

最近对图像处理十分感兴趣,也学着用opencv 实现各种简单的图像处理,因此,有了下面的实验,就是将照片处理成漫画的风格。

对照片进行动漫话一般需要四个步骤
1、边缘检测
2、将边缘检测得到的边缘 以黑色的形式贴在原来的画上。
3、对贴了边缘的图进行双边滤波,双边滤波可以较好的滤波的同时保留边缘。
4、修改图像的颜色的饱和度,本文采用的是将RGB转化为HSI空间,然后调整S分量。

边缘检测

对于边缘检测,本文采用的是canny算法
此文中将低阈值设定在70,高阈值则为70*3。
执行后的结果为:

C++ opencv如何将图片动漫化

贴边缘图到原图

将边缘图以黑色贴到原图上,原图上非边缘区域仍然为原来的颜色,动漫就是边缘很明显,且边缘不是很多,不注重细节,因此这里将边缘贴上面当作边缘,后续利用双倍滤波将图中的其他相对小的细节边缘去掉。针对纹理贴图主要用到下面这个函数:

// 将边缘检测后的图 cannyImage 边以黑色的形式贴在原图 image上。void pasteEdge(Mat &image, Mat &outImg, IplImage cannyImage){    Mat cannyMat;    //将IplImage转化为Mat    cannyMat = cvarrToMat(&cannyImage);     //颜色反转    cannyMat = cannyMat < 100;    image.copyTo(outImg, cannyMat);}

执行后的效果如下:

C++ opencv如何将图片动漫化

双边滤波

双边滤波(Bilateral filter)在图像美化,美颜上有广泛的运用,是一种可以保边去噪的滤波器,由两个函数构成。为了节约时间,这里就借用一张图来充当介绍了

C++ opencv如何将图片动漫化

opencv也对此有函数调用:

void bilateralFilter( InputArray src, OutputArray dst, int d,                                   double sigMacolor, double sigmaSpace,                                   int borderType = BORDER_DEFAULT );

前面2个参数为输入图像,输出图像,d为双倍滤波的算子大小,sigmacolor ,sigmaSpace是2个滤波函数的nameda值(这里节约时间不打符号了)
本文相关代码:

    // 双边滤波    Mat binateMat;    bilateralFilter(pasteEdgeMat, binateMat, 10, 50, 50, BORDER_DEFAULT);

执行后的结果如下:

C++ opencv如何将图片动漫化

HSI空间修改饱和度

关于HSI颜色空间这里就不详细介绍了,大家可以百度下,很多文章介绍,后续我也可能总结一下各个颜色空间,并且与rgb转换方法。主要思路:将贴有边缘 且 双边滤波后的图像 转化为 HSI 空间,而将S分量增大到原来的SRadio倍,然后将HSI空间图像转化回Rgb,并显示。

将颜色空间转化HSI,并增加S分量为原来的sRadio倍,主要是使用了下面这个函数:

// 将image 像素转化到 HSI 空间,并调整S 即颜色的饱和度,void changeSImage(Mat &image, IplImage &outImg, float sRadio){    int rows = image.rows;    int cols = image.cols;    // 三个HSI空间数据矩阵    CvMat* HSI_H = cvCreateMat(rows, cols, CV_32FC1);    CvMat* HSI_S = cvCreateMat(rows, cols, CV_32FC1);    CvMat* HSI_I = cvCreateMat(rows, cols, CV_32FC1);    // 原始图像数据指针, HSI矩阵数据指针    uchar* data;    // rgb分量    int img_r, img_g, img_b;    int min_rgb;  // rgb分量中的最小值    // HSI分量    float fHue, fSaturation, fIntensity;    int channels = image.channels();    for (int i = 0; i < rows; i++)    {        for (int j = 0; j < cols; j++)        {            data = image.ptr<uchar>(i);            data = data + j*channels;            img_b = *data;            data++;            img_g = *data;            data++;            img_r = *data;            // Intensity分量[0, 1]            fIntensity = (float)((img_b + img_g + img_r) / 3) / 255;            // 得到RGB分量中的最小值            float fTemp = img_r < img_g ? img_r : img_g;            min_rgb = fTemp < img_b ? fTemp : img_b;            // Saturation分量[0, 1]            fSaturation = 1 - (float)(3 * min_rgb) / (img_r + img_g + img_b);            // 计算theta角            float numerator = (img_r - img_g + img_r - img_b) / 2;            float denominator = sqrt(                pow((img_r - img_g), 2) + (img_r - img_b)*(img_g - img_b));            // 计算Hue分量            if (denominator != 0)            {                float theta = acos(numerator / denominator) * 180 / 3.14;                if (img_b <= img_g)                {                    fHue = theta;                }                else                {                    fHue = 360 - theta;                }            }            else            {                fHue = 0;            }            // 赋值            cvmSet(HSI_H, i, j, fHue);            cvmSet(HSI_S, i, j, fSaturation * sRadio);            cvmSet(HSI_I, i, j, fIntensity);        }    }    outImg = *HSI2RGBImage(HSI_H, HSI_S, HSI_I);    }

HSI2RGBImage(HSI_H, HSI_S, HSI_I)是将三个分类的Mat 合并并转化为BGR的图,函数如下:

IplImage* HSI2RGBImage(CvMat* HSI_H, CvMat* HSI_S, CvMat* HSI_I){    IplImage * RGB_Image = cvCreateImage(cvGetSize(HSI_H), IPL_DEPTH_8U, 3);    int iB, iG, iR;    for (int i = 0; i < RGB_Image->height; i++)    {        for (int j = 0; j < RGB_Image->width; j++)        {            // 该点的色度H            double dH = cvmGet(HSI_H, i, j);            // 该点的色饱和度S            double dS = cvmGet(HSI_S, i, j);            // 该点的亮度            double dI = cvmGet(HSI_I, i, j);            double dTempB, dTempG, dTempR;            // RG扇区            if (dH < 120 && dH >= 0)            {                // 将H转为弧度表示                dH = dH * 3.1415926 / 180;                dTempB = dI * (1 - dS);                dTempR = dI * (1 + (dS * cos(dH)) / cos(3.1415926 / 3 - dH));                dTempG = (3 * dI - (dTempR + dTempB));            }            // GB扇区            else if (dH < 240 && dH >= 120)            {                dH -= 120;                // 将H转为弧度表示                dH = dH * 3.1415926 / 180;                dTempR = dI * (1 - dS);                dTempG = dI * (1 + dS * cos(dH) / cos(3.1415926 / 3 - dH));                dTempB = (3 * dI - (dTempR + dTempG));            }            // BR扇区            else            {                dH -= 240;                // 将H转为弧度表示                dH = dH * 3.1415926 / 180;                dTempG = dI * (1 - dS);                dTempB = dI * (1 + (dS * cos(dH)) / cos(3.1415926 / 3 - dH));                dTempR = (3 * dI - (dTempG + dTempB));            }            iB = dTempB * 255;            iG = dTempG * 255;            iR = dTempR * 255;            cvSet2D(RGB_Image, i, j, cvScalar(iB, iG, iR));        }    }    return RGB_Image;}

执行后就大功告成了,效果如下:

C++ opencv如何将图片动漫化

后续:

上述执行基本完成了照片的漫画风格,但看到天空的云的一些边缘泰国刺眼,本着好玩的性子,去掉了第一步和第二步,直接图原图进行了双边滤波和增加颜色饱和度,感觉图清晰,自然了些,但漫画风格也少了些,具体如何见下图:

C++ opencv如何将图片动漫化

感谢各位的阅读!关于“C++ opencv如何将图片动漫化”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: C++ opencv如何将图片动漫化

本文链接: https://www.lsjlt.com/news/321369.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ opencv如何将图片动漫化
    这篇文章给大家分享的是有关C++ opencv如何将图片动漫化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近对图像处理十分感兴趣,也学着用opencv 实现各种简单的图像处理,因此,有了下面的实验,...
    99+
    2023-06-28
  • C++ opencv将图片动漫化介绍
    目录边缘检测贴边缘图到原图双边滤波HSI空间修改饱和度后续:总结最近对图像处理十分感兴趣,也学着用opencv 实现各种简单的图像处理,因此,有了下面的实验,就是将照片处理成漫画的风...
    99+
    2024-04-02
  • C++ AnimeGAN实现照片一键动漫化
    目录前言环境安装C++推理运行结果前言 AnimeGAN是来自武汉大学和湖北工业大学的AI项目,是由神经网络风格迁移加生成对抗网络(GAN)而成,它是基于CartoonGAN的改进,...
    99+
    2024-04-02
  • 如何使用Python将图片转为漫画风格
    本篇内容主要讲解“如何使用Python将图片转为漫画风格”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Python将图片转为漫画风格”吧!安装OpenCV首先,我们需要安装OpenCV。...
    99+
    2023-07-06
  • 如何使用Python OpenCV实现人物动漫化效果
    这篇文章主要介绍如何使用Python OpenCV实现人物动漫化效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果展示第一组古风美女原图效果图啊......西湖的水 我的泪......这张图动漫化的超级...
    99+
    2023-06-26
  • 如何用PHP将女友照片转成可爱的动漫头像
    这篇文章主要介绍“如何用PHP将女友照片转成可爱的动漫头像”,在日常操作中,相信很多人在如何用PHP将女友照片转成可爱的动漫头像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用PHP将女友照片转成可爱的动...
    99+
    2023-06-29
  • OpenCV如何自动给图片添加彩虹特效
    小编给大家分享一下OpenCV如何自动给图片添加彩虹特效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 实现步骤【1】准备一张夏季风景图片,加载读取Ma...
    99+
    2023-06-25
  • Unity如何实现人像动漫化效果
    这篇文章主要介绍了Unity如何实现人像动漫化效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Unity如何实现人像动漫化效果文章都会有所收获,下面我们一起来看看吧。接口介绍:运用对抗生成网络技术,结合人脸检...
    99+
    2023-06-26
  • C++和OpenCV如何实现图像字符化效果
    今天小编给大家分享一下C++和OpenCV如何实现图像字符化效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现原理图像字...
    99+
    2023-06-30
  • php如何将图片设置为圆形图片
    这篇文章主要讲解了“php如何将图片设置为圆形图片”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何将图片设置为圆形图片”吧!php将图片设置为圆形图片的方法:1、创建一个PHP示例文...
    99+
    2023-06-25
  • 如何使用PHP将HTML代码转化为图片
    PHP和HTML代码是当今互联网开发中最流行的技术。这些技术与技巧不仅允许开发人员构建美观而强大的网站,而且可以实现一些惊人的功能。然而,有些场景下需要将代码转化为图片的方式展示,比如在邮件中提供代码示例、在报告中展示代码样例等,这时php...
    99+
    2023-05-14
    php html
  • python如何实现将JPG、BMP图片转化为bgr
    这篇文章主要介绍“python如何实现将JPG、BMP图片转化为bgr”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python如何实现将JPG、BMP图片转化为bgr”文章能帮助大家解决问题。py...
    99+
    2023-07-05
  • C++ opencv图像处理怎么实现图片几何变换
    本文小编为大家详细介绍“C++ opencv图像处理怎么实现图片几何变换”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++ opencv图像处理怎么实现图片几何变换”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-30
  • C++opencv图像处理实现图片几何变换示例
    目录简介一、图像平移1.图像平移代码 (不改变图像大小)2.图像平移代码 (改变图像大小)二、图像旋转1.图像旋转函数2.仿射变换函数3.代码三、图像缩放1.图像缩放函数2.图像缩小...
    99+
    2024-04-02
  • C#如何将图片保存到一个XML文件
    这篇文章将为大家详细讲解有关C#如何将图片保存到一个XML文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。将图片保存到一个XML文件WinForm的资源文件中,将PictureBox的Image属性等非...
    99+
    2023-06-26
  • 如何实现Opencv图片的OCR识别
    小编给大家分享一下如何实现Opencv图片的OCR识别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、图片变换0、导入模块导入相关函数,遇到报错的话,直接pip...
    99+
    2023-06-06
  • c++结合opencv如何实现读取多张图片并显示
    目录方法一方法二方法三方法一 主要函数 void cv::glob(String pattern,std::vector<string>&result,bool ...
    99+
    2022-11-13
    c++结合opencv opencv读取多张图片 opencv图片显示
  • 如何在Linux上将HTML页面转化成png图片
    这篇文章给大家介绍如何在Linux上将HTML页面转化成png图片,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我们可以使用CutyCapt这个方法将一个特定页面抓取一张png图片,在CutyCapt中可以使用WebK...
    99+
    2023-06-28
  • php如何将ppt转jpg图片
    本篇内容介绍了“php如何将ppt转jpg图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP将ppt转成图片查看PHP安装COM组件1...
    99+
    2023-06-20
  • css3如何将彩色图片改为黑白色图片
    本篇内容介绍了“css3如何将彩色图片改为黑白色图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作