OpenCV 圖像銳化處理、提高圖像對比度


獲取圖像像素指針
CV_Assert(myImage.depth() == CV_8U);

Mat.ptr(int i=0)獲取像素矩陣指針,索引i表示第i行,從0開始計數;

獲得當前指針const uchar* current = myImage.ptr(row);

獲取當前像素點P(row, col)的像素值p(row, col) = current[col];

像素范圍處理saturate_cast
saturate_cast(小於0的數), 返回0;

saturate_cast(大於255的數), 返回255;

saturate_cast(0-255之間的數), 返回輸入的值本身;

這個函數的功能是,確保RGB值的范圍處於0-255之間;’

提高圖像對比度原理

通過計算,使得當前像素=5*當前像素-(左側像素+右側像素+上方像素+下方像素);

這樣計算的目的是,使得圖像中亮的部分更亮,暗的部分更暗,從而增加圖像的對比度;

程序實現

 1 #include <iostream>
 2 #include <opencv2/opencv.hpp>
 3 #include <math.h>
 4 
 5 using namespace std;  6 using namespace cv;  7 
 8 int main() {  9     // 加載一張普通圖片
10  Mat src, dst; 11     src = imread("C:\\Users\\Administrator\\Desktop\\background.png"); 12     if (!src.data) {  // 判斷是否獲取到了圖片
13         printf("Could not load image!\n"); 14         return -1; 15  } 16     // 將這張普通圖片顯示出來
17     namedWindow("input image", WINDOW_AUTOSIZE); 18     imshow("input image", src); 19 
20     // 這里要用圖片和掩膜做卷積操作,所以要把最外面的那一圈像素去掉 21     // 圖像寬度 = 每一行像素點個數 X 每個像素點的通道數(如:RGB) 22     // 序號是從0開始的,所以-1后,相當於把第一個和最后一個像素點去掉
23     int cols = (src.cols-1) * src.channels(); 24     int offsetx = src.channels(); 25     // 獲取圖像高度
26     int rows = src.rows; 27     // 創建一個和載入圖片相同大小的空的矩陣
28     dst = Mat::zeros(src.size(), src.type()); 29 
30     // 序號是從第0行開始的,這樣把第0行略過
31     for (int row = 1; row < (rows - 1); row++) { 32         const uchar* previous = src.ptr<uchar>(row - 1);  // 獲取上一行指針
33         const uchar* current = src.ptr<uchar>(row);  // 獲取當前行指針
34         const uchar * next = src.ptr<uchar>(row + 1);  // 獲取下一行指針 35         // 創建一個行指針指向創建的空矩陣的對應行
36         uchar* output = dst.ptr<uchar>(row); 37         for (int col = offsetx; col < cols; col++) { 38             // 把每個像素的值限定在0-255之間
39             output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col])); 40  } 41  } 42 
43     // 顯示提高對比度之后的圖像
44     namedWindow("contrast image demo", WINDOW_AUTOSIZE); 45     imshow("contrast image demo", dst); 46 
47     waitKey(0);  // 讓程序在這里卡住,不然會一下子退出
48 
49     return 0;

運行效果

左側為原圖,右側為處理后的圖像:

函數調用filter2D功能
1、定義掩膜:Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

2、filter2D(src, dst, src.depth(), kernel); 其中src與dst是Mat類型變量、src.depth表示位圖深度,有32、24/8等;

程序實現

 1 #include <iostream>
 2 #include <opencv2/opencv.hpp>
 3 #include <math.h>
 4 
 5 using namespace std;  6 using namespace cv;  7 
 8 int main() {  9     // 加載一張普通圖片
10  Mat src, dst; 11     src = imread("C:\\Users\\Administrator\\Desktop\\background.png"); 12     if (!src.data) {  // 判斷是否獲取到了圖片
13         printf("Could not load image!\n"); 14         return -1; 15  } 16     // 將這張普通圖片顯示出來
17     namedWindow("input image", WINDOW_AUTOSIZE); 18     imshow("input image", src); 19 
20     // 使用內置的API
21     Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); 22  filter2D(src, dst, src.depth(), kernel); 23 
24     // 顯示提高對比度之后的圖像
25     namedWindow("contrast image demo", WINDOW_AUTOSIZE); 26     imshow("contrast image demo", dst); 27 
28     waitKey(0);  // 讓程序在這里卡住,不然會一下子退出
29 
30     return 0; 31 }

通過調用API我們一樣達到了同樣的圖片處理效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM