opencv 图片染色 及 移动

opencv 图片染色 及 移动

  • 前言
  • 一、图片的染色
  • 二、图片的移动
      • 1、图片移动的opencv库函数(warpAffine)参数解释
      • 2、实现
  • 3、效果及调用
    • 1、原图
    • 2、调用函数
    • 3、效果图


前言

图像染色的原理很简单,首先指定一种渲染颜色,然后计算图片当前像素点的B ,G,R的平均值,用当前像素的平均值分别乘以渲染颜色的B、G、R分量值并除与255,将结果做为当前象素的最终颜色
提示:以下是本篇文章正文内容,下面案例可供参考

一、图片的染色

QImage ImageHandle::Dyeing(QImage &image, int blue, int green, int red)
{
     
    image = image.convertToFormat(QImage::Format_RGB888);
    cv::Mat mat = this->QImage2Mat(image);
    //初始化目标Mat
    cv::Mat dst = cv::Mat::zeros(mat.size(),mat.type());
    int chl = mat.channels();
    //处理每个像素点的像素
    for(int row=0;row<mat.rows;row++)
    {
     
        for(int col=0;col<mat.cols;col++)
        {
     
            //计算每个像素点三个通道的的平均值 这样可以达到染色的效果而不是增加亮度
            int avg = (mat.at<cv::Vec3b>(row,col)[0] + mat.at<cv::Vec3b>(row,col)[1] + mat.at<cv::Vec3b>(row,col)[2])/3;
            //处理每个通道的值 传入的颜色*平均值/255
            if(chl == 3)
            {
     
                if(blue == 0)
                {
     
                    dst.at<cv::Vec3b>(row,col)[0] = 0;
                }
                else
                {
     
                	//使用saturate 可以防止像素溢出 失真
                    dst.at<cv::Vec3b>(row,col)[0] = cv::saturate_cast<uchar>(blue * avg/255);
                }
                if(green == 0)
                {
     
                    dst.at<cv::Vec3b>(row,col)[1] = 0;
                }
                else
                {
     
                    dst.at<cv::Vec3b>(row,col)[1] = cv::saturate_cast<uchar>(avg * green /255);
                }
                if(red == 0)
                {
     
                    dst.at<cv::Vec3b>(row,col)[2] = 0;
                }
                else
                {
     
                    dst.at<cv::Vec3b>(row,col)[2] = cv::saturate_cast<uchar>(avg * red / 255);
                }
            }
        }
    }
    return this->Mat2QImage(dst);
}

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、图片的移动

1、图片移动的opencv库函数(warpAffine)参数解释

void warpAffine( InputArray src, OutputArray dst,
                              InputArray M, Size dsize,
                              int flags = INTER_LINEAR,
                              int borderMode = BORDER_CONSTANT,
                              const Scalar& borderValue = Scalar());

1、第一个参数 src 为原图片
2、第二个参数 dst 为输出图片
3、第三个参数 M 为位移矩阵
4、第四个参数 dsize 为原图像的尺寸
5、第五个参数 borderMode 为边缘处理模式 选择默认的即可
6、第六个参数 borderValue 为颜色

enum BorderTypes {
     
    BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`
    BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
    BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`
    BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`
    BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
    BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`

    BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
    BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
    BORDER_ISOLATED    = 16 //!< do not look outside of ROI
};

2、实现

QImage ImageHandle::PicturesMoving(QImage &image, int x, int y)
{
     
    image = image.convertToFormat(QImage::Format_RGB888);
    cv::Mat src = this->QImage2Mat(image);
    cv::Mat dst;
    //创建位移矩阵
    cv::Mat t_mat =cv::Mat::zeros(2, 3, CV_32FC1);
    t_mat.at<float>(0, 0) = 1;
    t_mat.at<float>(0, 2) = x; //水平平移量
    t_mat.at<float>(1, 1) = 1;
    t_mat.at<float>(1, 2) = y; //竖直平移量

    cv::warpAffine(src,dst,t_mat,src.size());
    return this->Mat2QImage(dst);
}

3、效果及调用

1、原图

opencv 图片染色 及 移动_第1张图片

2、调用函数

int main(int argc, char *argv[])
{
     
    QApplication a(argc, argv);
    QImage temp;
    temp = QImage("temp.png");
    ImageHandle f;
    temp = f.Dyeing(temp,125,125,125);
    temp = f.PicturesMovng(temp,2020);
    QLabel *m_label = new QLabel();
    m_label->resize(1280,1024);
    QPixmap I_map = QPixmap::fromImage(temp);
    I_map = I_map.scaled(m_label->width(),m_label->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    m_label->setPixmap(I_map);
    m_label->show();
    return a.exec();
}
    

3、效果图

opencv 图片染色 及 移动_第2张图片

你可能感兴趣的:(opencv,计算机视觉,人工智能)