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、原圖

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340581.html
標籤:其他
上一篇:Ubuntu20.04 vscode + opencv4教程(2021.10.27完成)
下一篇:matlab 清濁音判斷+源代碼
