【目的】:圖像掩膜的目的很單純,亮的地方變亮一些,暗的地方變暗一些,公式如下

其實這個公式沒什么意思,如果你有好的idea也可以,我們每次定位到中心5的那個地方,乘上5倍,然后減掉周圍的像素值,舉一個例子,中心是10,上下左右分別是20,30,40,50,你應用公式之后得到的是一個負值,這個時候有一個opencv的函數saturate_cast<uchar>如果你的值是負的他會映射到0,0---255之間保持不變,大於255映射到255,然后他會映射到0,這樣那個像素點就變得更暗了,代碼實現如下(采用普遍方法):
#include <iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat image = imread("timg2.jpg");//打開圖像的Mat對象 Mat newimage(image.size(), image.type()); Mat kern = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//掩膜數組 int chan = image.channels();//代表圖片的通道數,一般灰色圖是單通道 int row = image.rows;//圖像矩陣的行數 int cols = (image.cols - 1) * image.channels();//圖像矩陣的列數,假設他是單通道,對於這個時候公式仍然成立 //所以換成多通道的時候等價於對每一個通道進行操作,一般灰色有一個通道,彩色有三個通道RGB,更甚者還可以 //加上一個透明顏色的通道 for (int i = 1; i < (row - 1); i++) { //創建像素指針 const uchar* prev = image.ptr(i);//中心的部分 const uchar* prew = image.ptr(i - 1); const uchar* pres = image.ptr(i + 1); uchar* output = newimage.ptr<uchar>(i); for (int j = chan; j < cols; j++) { output[j] = saturate_cast<uchar>(5*prev[j] - (prev[j - chan] + prev[j + chan] + prew[j] + pres[j])); } } if (!image.data) { cout << "圖片打開失敗" << endl; return -1; } Mat array = (Mat_<uchar>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); filter2D(image,newimage,image.depth(),array); imwrite("text.jpg", newimage); namedWindow("IMAGE", CV_WINDOW_AUTOSIZE); imshow("IMAGE", image); namedWindow("IMAGE2", CV_WINDOW_AUTOSIZE); imshow("IMAGE2", newimage); waitKey(0); return 0; }
處理完圖片的結果:

雖然處理完之后圖像更差強人意了,但是對比度提高了不少
