1. 程式人生 > >影象處理(1)——對比度和亮度調整

影象處理(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。
sigmoid函式影象

函式的基本性質:

  1. 定義域:(−∞,+∞)(−∞,+∞)
  2. 值域:(−1,1)(−1,1)
  3. 函式在定義域內為連續和光滑函式
  4. 處處可導,導數為:f′(x)=f(x)(1−f(x))

對其求導並結合影象給定引數,得到函式
 

255 / ( 1 + e k (
x 127.5 ) ) &ThinSpace; \ 255/(1+e^-k(x-127.5))\,
其程式碼為

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;
}

結果

最終結果為:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

點選下載完整程式碼


  1. https://blog.csdn.net/liumangmao1314/article/details/58677849 ↩︎