生活随笔
收集整理的這篇文章主要介紹了
opencv学习(六)之掩膜版
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可以通過掩模矩陣(通常來講叫核)對圖像的每個圖像像素值重新計算。這個掩模板能夠調整臨近像素包括當前像素對新像素的影響程度。從數學的角度來講,我們用特殊的值對當前的值做了一個加權平均的操作。舉個例子,設想一個圖像對比度增強的方法,基本上,我們要將下面的公式應用到每一個像素上:
第一個公式是用數學公式,第二個是用一個掩模板。將掩模板中心放到你想計算像素上,將像素值累加并乘以與重疊矩陣值想成。對于較大的矩陣來看,后一種表達方式更容易理解。
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>using namespace std;
using namespace cv;
void Sharpen(
const Mat& myImage, Mat& Result);
int main()
{Mat srcImage = imread(
"lena.jpg");
if(srcImage.data)
cout <<
"圖像加載成功!" << endl << endl;
else{
cout <<
"圖像加載失敗!" << endl << endl;
return -
1;}namedWindow(
"srcImage", WINDOW_AUTOSIZE);imshow(
"srcImage", srcImage);Mat dstImage;dstImage.create(srcImage.size(), srcImage.type());Sharpen(srcImage, dstImage);namedWindow(
"dstImage",WINDOW_AUTOSIZE);imshow(
"dstImage",dstImage);waitKey(
0);
return 0;
}
void Sharpen(
const Mat& myImage, Mat& Result)
{CV_Assert(myImage.depth() == CV_8U);
const int nChannels = myImage.channels();
for(
int j =
1; j < myImage.rows -
1; ++j){
const uchar* precious = myImage.ptr<uchar>(j -
1);
const uchar* current = myImage.ptr<uchar>(j);
const uchar* next = myImage.ptr<uchar>(j +
1); uchar* output = Result.ptr<uchar>(j);
for(
int i = nChannels; i < nChannels * (myImage.cols -
1); ++i){*output++ = saturate_cast<uchar>(
5 * current[i]-current[i-nChannels]-current[i+nChannels]-precious[i]-next[i]);}}Result.row(
0).setTo(Scalar(
0)); Result.row(Result.rows-
1).setTo(Scalar(
0)); Result.col(
0).setTo(Scalar(
0)); Result.col(Result.cols-
1).setTo(Scalar(
0));
}
運行結果如圖所示:
對上述程序簡單做個分析。
(1). main()函數中加載圖像后一定要判斷圖像是否加載成功,這是良好的編程習慣。判斷圖像是否加載成功有兩種方式如下:
//圖像為空即加載失敗
if(srcImage.empty())
{//
...處理方法
...
}
else //圖像加載成功
{//
...圖像加載成功
...
}//圖像是否有數據
if(srtImage.data)
{//
...處理方法
...
}
else //即圖像加載失敗
{//
...處理方法
...
}
注意:在使用empty()函數時其帶后面的”()”而使用data判斷時不帶”()”,這是兩者的區別。
(2). 加載圖像成功后使用CV_Assert()函數判斷圖像是否unsigned char 類型。
(3). 通過create()函數創建一個和原圖像尺寸和類型相同的目標圖像。對于create()等函數的用法可以參考opencv學習(一)之Mat類,里面有具體敘述,在此不過多介紹!
(4). 此程序是利用上述第一個數學公式對圖像像素進行重新計算和處理,通過其上下左右四個鄰域像素和其本身像素值通過計算得到新的像素值。在本程序中利用C語言[]操作符來讀取像素。因為我們需要同事讀取多行,所以提前獲取當前行,上一行和下一行的指針(previous、current、next).行指定完后還需要定義一個指針存儲計算結果(output).
(5). 對于列的處理先獲取當前圖像的通道數,然后對每個像素的每個通道上的數值進行計算: current[i - nChannels]和current[i + nChannels]兩個為當前像素左右兩個像素相同通道的值,而previous[i]和next[i]為上下兩個像素值相同通道的像素值.
(6). 利用本方法計算時,對于圖像的上下左右四條邊最外面的像素點無法計算,故在最后利用四行代碼對其進行認為賦值為0,這樣得到的計算結果與原圖像相比,四周會出現黑線!!!
總結
以上是生活随笔為你收集整理的opencv学习(六)之掩膜版的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。