前言
本文介紹opencv的矩陣掩膜操作,
一、影像的基本操作:
1、影像的定義:影像是指由輸入設備捕捉的實際場景畫面或以數字化形式存盤的任意畫面(由一個個像素組成),像素是組成影像的最小單位,而每個像素則由多個(通常為3個)不同顏色(通常為紅、綠、藍)的點組成

2、影像的基本運算有很多種,例如:+、-、*、/、位運算、平方根、對數、絕對值等;
3、影像也可以放大、縮小、旋轉,還可以截取其中的一部分作為ROI(感興趣區域)進行操作;
4、各個顏色通道可以分別提取及對各個顏色通道進行各種運算操作*(例如RGB有3種顏色通道,都可以進行運算),
二、掩膜(Mask)是什么?
1、掩膜的組成:掩模是由0和1組成的一個二進制影像,
可簡單理解為一個由0和1組成的矩陣,
2、掩膜的定義:用選定的影像、圖形或物體,對處理的影像(全部或區域)進行遮擋,來控制影像處理的區域或處理程序,
在OpenCV的中,掩模操作是相對簡單的,大致的意思是,通過一個掩模矩陣,重新計算影像中的每一個像素值,掩模矩陣控制了舊影像當前位置以及周圍位置像素對新影像當前位置像素值的影響力度,用數學術語講,即我們自定義一個權重表,
3、掩膜操作舉例:我們簡單用與運算(&)舉個例子:
運算方式:原圖中每個像素和掩膜中的每個對應像素進行與運算,

三、掩膜(Mask)實作影像對比度的調整:
1、掩膜操作計算公式:
2、opencv的語法:
2.1 獲取矩陣的行指標ptr函式 const uchar *current = src.ptr(row);
FF
2.2 獲取矩陣每個像素的通道數 int offsetx = src.channels();
2.3 像素的點值處理函式,saturate_cast(uchar數值)功能是確保RGB值范圍在0?255之間,
像素的范圍處理:
saturate_cast ( - 1),小于0回傳0
saturate_cast (256),大于255回傳255
saturate_cast (100),回傳100
2.4 函式呼叫filter2D功能
定義掩膜:
Mat kernel = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D( src, dst, src.depth(), kernel ); 其中src與dst是Mat型別變數、src.depth()表示位圖深度,有32、24、8等,kernel是Mat物件,
3、代碼實作:
3.1 自定義掩膜操作
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src, dst;
src = imread("C:\\Users\\ASUS\\Desktop\\1.jpg");
if (!src.data) {
cout << "could not load image!";
return 0;
}
namedWindow("my_screen", WINDOW_AUTOSIZE); //創建一個視窗,自動大小不可人為改變
imshow("my_screen", src);
int cols = src.cols * src.channels(); //cols獲取影像的列,因為每個像素有3個像素通道,channels獲取像素通道
int offsetx = src.channels(); //channels獲取像素通道
int rows = src.rows; //rows獲取像素的行
dst = Mat(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 = dst.ptr<uchar>(row);
for (int col = offsetx; col < cols; col++) {
output[col] = saturate_cast<uchar>(5 * current[col] -
(current[col - 1 - offsetx] + current[col + offsetx] + previous[col] + next[col]));
//利用像素處理函式,處理越界數值
}
}
namedWindow("contrast image demo", WINDOW_AUTOSIZE);
imshow("contrast image demo", dst);
waitKey(0);
return 0;
}
3.2 函式呼叫filter2D功能操作:
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src, dst;
src = imread("C:\\Users\\ASUS\\Desktop\\1.jpg");
if (!src.data) {
cout << "could not load image!";
return 0;
}
namedWindow("my_screen", WINDOW_AUTOSIZE); //創建一個視窗,自動大小不可人為改變
imshow("my_screen", src);
//用opencv的API filter2D
double t = getTickCount();
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernel);
double timeconsums = (getTickCount() - t) / getTickFrequency();
cout << "time consume " << timeconsums; //用來計算時長
namedWindow("contrast image demo", WINDOW_AUTOSIZE);
imshow("contrast image demo", dst);
waitKey(0);
return 0;
}
4、處理結果:
四、總結:
本文的矩陣掩膜就是兩幅影像之間進行的各種位運算操作,
如有錯誤,請指教!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/251760.html
標籤:其他
上一篇:遺留問題:unsigned char *轉換為char
下一篇:2.匯編求無符號數的平均數
