影象處理(1)——對比度和亮度調整
1.內容
設計一個Sigmoid函式,實現對影象的對比度調整;
使用opencv視窗系統的slider控制元件,互動改變Sigmoid函式的引數,實現不同程度的對比度調整;
2.方法
一次函式方法
想要調整圖片的對比度,就要對圖片中的畫素進行操作,改變畫素的值來達到調整圖片對比度的目的。
而使用一次函式來調整對比度的方法十分簡單,函式如下:
new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar> (0.01*a*(image.at<Vec3b>(y,x)[c])+b);
將圖片畫素定為x,想要改變x的值,就要改變其係數a和引數b,通過a來改變圖片的對比度,通過b來改變圖片的亮度。
sigmoid函式方法
Sigmoid函式,即f(x)=1/(1+e-x),該函式具有如下的特性:當x趨近於負無窮時,y趨近於0;噹噹x趨近於正無窮時,y趨近於1;當x=1/2時,y=0。
函式的基本性質:
- 定義域:(−∞,+∞)(−∞,+∞)
- 值域:(−1,1)(−1,1)
- 函式在定義域內為連續和光滑函式
- 處處可導,導數為:f′(x)=f(x)(1−f(x))
對其求導並結合影象給定引數,得到函式
其程式碼為
new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
((255/(1+exp(a*((image.at<Vec3b>(y,x)[c])-127.5))))+b);
其中圖片仍然是x,a是調整對比度的係數,b是調整亮度的引數。
3.滑動條
滑動條在OpenCV是動態調節引數的一種特別好用的工具。比如邊緣檢測,閾值化,對比度和亮度調節等。它是在規定視窗顯示,並調節引數控制顯示影象。
使用滑動條的主要步驟有如下幾步:
-
1、建立視窗
用namedWindow()函式建立視窗。如:namedWindow(“邊緣檢測”,WINDOW_AUTOSIZE); -
2、建立滑動條
createTrackbar()函式的各個引數可以參考相關書籍,這裡不再贅述。
這裡說一下值得注意的地方,
第一個引數是調節的引數名;
第二個引數是視窗名;即上步建立視窗名”邊緣檢測”,不要亂寫,否則不出現滑動條;
第三個引數是int *,即引數名取地址,如“&thresholds”;
第四個引數是調節引數最大值,可以直接數字表示;
第五個引數是回撥函式名,即調節的引數被那個函式使用,就調哪個函式。
如:cv::createTrackbar(“閾值:”,”邊緣檢測”,&thresholds,100, canny_track); -
3、回撥函式
在createTrackbar()函式第五個引數是哪個,回撥函式就是哪個。例如:canny_track(0,0)。 -
4、書寫回調函式
回撥函式編寫沒什麼好說的,值得注意兩點的是:
一、如果有產生新的影象,那麼新的影象變數名不能用之前的變數;如Canny(),結果影象要重新在回撥函式canny_track()中編寫。
二、如果要顯示影象,imshow()函式中的視窗名要跟第一步建立視窗名一致,如果不一致,那麼是滑動條和影象不在一個視窗顯示,可能其他情況會需要這種結果,就另說了。
程式碼1為:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int thresholds=50;
Mat image,srcimage;
void canny_track(int ,void *)
{
Mat result;
Canny(srcimage,result,thresholds,thresholds*3,3);
imshow("邊緣檢測",result);
}
int main()
{
image=imread("C:\\Users\\Administrator\\Desktop\\image\\C.jpg");
if(!image.data)
{
return 0;
}
cvtColor(image,srcimage,CV_BGR2GRAY);
namedWindow("邊緣檢測",WINDOW_AUTOSIZE);
cv::createTrackbar("閾值:","邊緣檢測",&thresholds,100,canny_track);
canny_track(0,0);
waitKey(0);
return 0;
}
結果
最終結果為: