图像染色的原理很简单,首先指定一种渲染颜色,然后计算图片当前像素点的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 的一种工具,该工具是为了解决数据分析任务而创建的。
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
};
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);
}
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();
}