栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

opencv 图片染色 及 移动

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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(row,col)[0] + mat.at(row,col)[1] + mat.at(row,col)[2])/3;
            //处理每个通道的值 传入的颜色*平均值/255
            if(chl == 3)
            {
                if(blue == 0)
                {
                    dst.at(row,col)[0] = 0;
                }
                else
                {
                	//使用saturate 可以防止像素溢出 失真
                    dst.at(row,col)[0] = cv::saturate_cast(blue * avg/255);
                }
                if(green == 0)
                {
                    dst.at(row,col)[1] = 0;
                }
                else
                {
                    dst.at(row,col)[1] = cv::saturate_cast(avg * green /255);
                }
                if(red == 0)
                {
                    dst.at(row,col)[2] = 0;
                }
                else
                {
                    dst.at(row,col)[2] = cv::saturate_cast(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(0, 0) = 1;
    t_mat.at(0, 2) = x; //水平平移量
    t_mat.at(1, 1) = 1;
    t_mat.at(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,20,20);
    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、效果图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/350541.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号