opencv 图片染色 及 移动


前言

图像染色的原理很简单,首先指定一种渲染颜色,然后计算图片当前像素点的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、原图

请添加图片描述

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、效果图

在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigProgrambug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值