c++ opencv 彩色转素描 素描转彩色

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>

using namespace cv;
using namespace std;
void addColor(Mat img);
int main(int argc, const char** argv){
    //system("color 2f");
    Mat a = imread("a2.jpg");
    //imshow("原图", a);
    cvtColor(a, a, CV_RGB2GRAY);     //转为灰度图
    Mat ax, ay;
    Mat axx, ayy;
    Sobel(a, ax, CV_16S, 1, 0, -1);
    Sobel(a, ay, CV_16S, 0, 1, -1);
    convertScaleAbs(ax, axx);      //将CV_16S转为CV_8U
    convertScaleAbs(ay, ayy);
    addWeighted(axx, 0.5, ayy, 0.5, 0, a);     //将两图相加
    imshow("效果图", a);
    addColor(a);
    waitKey(0);
        return 0;
    }
void addColor(Mat img){

    Mat img_pseudocolor(img.rows, img.cols, CV_8UC3);//构造RGB图像,参数CV_8UC3教程文档里面有讲解
    int tmp = 0;
    for (int y = 0; y<img.rows; y++)//转为伪彩色图像的具体算法
    {
        for (int x = 0; x<img.cols; x++)
        {
            tmp = img.at<unsigned char>(y, x);
            img_pseudocolor.at<Vec3b>(y, x)[0] = abs(255 - tmp); //blue
            img_pseudocolor.at<Vec3b>(y, x)[1] = abs(127 - tmp); //green
            img_pseudocolor.at<Vec3b>(y, x)[2] = abs(0 - tmp); //red
        }
    }

    imshow("img_pseudocolor", img_pseudocolor);

    Mat img_color(img.rows, img.cols, CV_8UC3);//构造RGB图像
#define IMG_B(img,y,x) img.at<Vec3b>(y,x)[0]
#define IMG_G(img,y,x) img.at<Vec3b>(y,x)[1]
#define IMG_R(img,y,x) img.at<Vec3b>(y,x)[2]
    uchar tmp2 = 0;
    for (int y = 0; y<img.rows; y++)//转为彩虹图的具体算法,主要思路是把灰度图对应的0~255的数值分别转换成彩虹色:红、橙、黄、绿、青、蓝。
    {
        for (int x = 0; x<img.cols; x++)
        {
            tmp2 = img.at<uchar>(y, x);
            if (tmp2 <= 51)
            {
                IMG_B(img_color, y, x) = 255;
                IMG_G(img_color, y, x) = tmp2 * 5;
                IMG_R(img_color, y, x) = 0;
            }
            else if (tmp2 <= 102)
            {
                tmp2 -= 51;
                IMG_B(img_color, y, x) = 255 - tmp2 * 5;
                IMG_G(img_color, y, x) = 255;
                IMG_R(img_color, y, x) = 0;
            }
            else if (tmp2 <= 153)
            {
                tmp2 -= 102;
                IMG_B(img_color, y, x) = 0;
                IMG_G(img_color, y, x) = 255;
                IMG_R(img_color, y, x) = tmp2 * 5;
            }
            else if (tmp2 <= 204)
            {
                tmp2 -= 153;
                IMG_B(img_color, y, x) = 0;
                IMG_G(img_color, y, x) = 255 - uchar(128.0*tmp2 / 51.0 + 0.5);
                IMG_R(img_color, y, x) = 255;
            }
            else
            {
                tmp2 -= 204;
                IMG_B(img_color, y, x) = 0;
                IMG_G(img_color, y, x) = 127 - uchar(127.0*tmp2 / 51.0 + 0.5);
                IMG_R(img_color, y, x) = 255;
            }
        }
    }

    imshow("img_ rainbowcolor", img_color);
}
    



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值