OpenCV學習第三篇:圖片的掩膜操作(實現影象的對比度調整)
阿新 • • 發佈:2019-02-14
掩膜操作實現影象的對比度調整
矩陣的掩膜操作十分簡單,根據掩膜來重新計算每個畫素的畫素值,掩膜(mask也被稱為kernel)
I(i,j) = 5* I(i,j)-[I(i-1,j)+I(i+1,j)+I(i,j-1)+I(i,j+1)]
我們的核心思想是對圖片中的每個畫素都做此操作,就是進行上面的公式!
—–分解形式
—–使用內建掩膜函式
利用getTickCount()函式來獲取當前時間, double timeconsume = (getTickCount() - t) / getTickFrequency();計算當前消耗時間!
以下是完整程式碼:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, drc;
src = imread("F:/識圖/645-140GG51042.JPG");
if (src.empty())
{
cout << "could not image loading......" << endl;
return -1 ;
}
//src.cols圖形的寬度,src.channels圖形的通道數
int cols = src.cols * src.channels();
int offsetx = src.channels();//多通道
//高度
int rows = src.rows;
//初始化目標物件,zeros代表和原影象一樣
drc = Mat::zeros(src.size(), src.type());
//for (int row = 1; row< rows-1; row++)
//{
// //算行的畫素
// const uchar* current = src.ptr<uchar>(row-1);//當前的指標所代表的畫素
// const uchar* previous = src.ptr<uchar>(row);//前一幀所代表的畫素
// const uchar* next = src.ptr<uchar>(row+1);//下一幀所代表的畫素
// uchar* output = drc.ptr<uchar>(row);//目標物件畫素
// for (int col = 0; col < cols; col++)
// {
// //算列的畫素
// //帶入目標公式current[col - offsetx]代表前一個current[col + offsetx]後面一個previous[col]正對著next[col]正對著(正對著代表列一樣),同理前面的列不一樣
// // saturate_cast<uchar>函式代表把畫素範圍控制在0-255之內
// output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));
// }
//}
//定義掩膜
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
//獲取當前時間
double t = getTickCount();
filter2D(src, drc, src.depth(), kernel);
//計算消耗時間
double timeconsume = (getTickCount() - t) / getTickFrequency();
cout << "timeScale:" << endl << timeconsume << endl;
namedWindow("BUTAFUIL GRIL", CV_WINDOW_AUTOSIZE);
imshow("BUTAFUIL GRIL", src);
imshow("GOOD GRIL", drc);
waitKey(0);
return 0;
}
這裡是列印結果:
美女是不是很漂亮嘿嘿,這樣才有敲程式碼的動力啊!一起學習的群號(601408323),有理想的童鞋一起來啊,歡迎!!