转载:【opencv入门教程之六】创建Trackbar图片对比度、亮度值调整
【OpenCV入門教程之六】 創(chuàng)建Trackbar & 圖像對比度、亮度值調(diào)整
淺墨_毛星云 2014-03-18 21:43:18 103746 收藏 21 最后發(fā)布:2014-03-18 21:43:18首發(fā):2014-03-18 21:43:18 分類專欄: 【OpenCV】 【OpenCV】入門教程 文章標(biāo)簽: opencv vs2010 c++ 圖像處理 版權(quán)聲明:本文為博主原創(chuàng)文章,遵循CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/zhmxy555/article/details/21479533 展開
本系列文章由@淺墨_毛星云 出品,轉(zhuǎn)載請注明出處。??
文章鏈接:?http://blog.csdn.net/poem_qianmo/article/details/21479533
作者:毛星云(淺墨)????郵箱:?happylifemxy@163.com?
寫作當(dāng)前博文時配套使用的OpenCV版本: 2.4.8
?
?
這篇文章中我們一起學(xué)習(xí)了如何在OpenCV中用createTrackbar函數(shù)創(chuàng)建和使用軌跡條,以及圖像對比度、亮度值的動態(tài)調(diào)整。
文章首先詳細(xì)講解了OpenCV2.0中的新版創(chuàng)建軌跡條的函數(shù)createTrackbar,并給上一個詳細(xì)注釋的示例。
然后講解圖像的對比度、亮度值調(diào)整的細(xì)節(jié),最后放出了一個利用createTrackbar函數(shù)創(chuàng)建軌跡條來輔助進行圖像對比度、亮度值調(diào)整的程序源碼。
依然是先放一張運行截圖:
?
好了,下面正式開始我們的講解。
一、OpenCV中軌跡條(Trackbar)的創(chuàng)建和使用
?
<1>創(chuàng)建軌跡條——createTrackbar函數(shù)詳解
createTrackbar這個函數(shù)我們以后會經(jīng)常用到,它創(chuàng)建一個可以調(diào)整數(shù)值的軌跡條,并將軌跡條附加到指定的窗口上,使用起來很方便。首先大家要記住,它往往會和一個回調(diào)函數(shù)配合起來使用。先看下他的函數(shù)原型:
?
- 第一個參數(shù),const string&類型的trackbarname,表示軌跡條的名字,用來代表我們創(chuàng)建的軌跡條。
- 第二個參數(shù),const string&類型的winname,填窗口的名字,表示這個軌跡條會依附到哪個窗口上,即對應(yīng)namedWindow()創(chuàng)建窗口時填的某一個窗口名。
- 第三個參數(shù),int* 類型的value,一個指向整型的指針,表示滑塊的位置。并且在創(chuàng)建時,滑塊的初始位置就是該變量當(dāng)前的值。
- 第四個參數(shù),int類型的count,表示滑塊可以達(dá)到的最大位置的值。PS:滑塊最小的位置的值始終為0。
- 第五個參數(shù),TrackbarCallback類型的onChange,首先注意他有默認(rèn)值0。這是一個指向回調(diào)函數(shù)的指針,每次滑塊位置改變時,這個函數(shù)都會進行回調(diào)。并且這個函數(shù)的原型必須為void XXXX(int,void*);其中第一個參數(shù)是軌跡條的位置,第二個參數(shù)是用戶數(shù)據(jù)(看下面的第六個參數(shù))。如果回調(diào)是NULL指針,表示沒有回調(diào)函數(shù)的調(diào)用,僅第三個參數(shù)value有變化。
- 第六個參數(shù),void*類型的userdata,他也有默認(rèn)值0。這個參數(shù)是用戶傳給回調(diào)函數(shù)的數(shù)據(jù),用來處理軌跡條事件。如果使用的第三個參數(shù)value實參是全局變量的話,完全可以不去管這個userdata參數(shù)。
?
這個createTrackbar函數(shù),為我們創(chuàng)建一個具有特定名稱和范圍的軌跡條(Trackbar,或者說是滑塊范圍控制工具),指定一個和軌跡條位置同步的變量。而且要指定回調(diào)函數(shù)onChange(第五個參數(shù)),在軌跡條位置改變的時候來調(diào)用這個回調(diào)函數(shù)。并且我們知道,創(chuàng)建的軌跡條顯示在指定的winname(第二個參數(shù))所代表的窗口上。
?
看完函數(shù)講解,先給大家一個函數(shù)使用小示例:
?
? ? ?
?
然給大家一個完整的使用示例。這是OpenCV官方的sample示例程序,一個演示了用軌跡條來控制輪廓檢測,輪廓填充的程序。淺墨將其修改、代碼簡潔化和詳細(xì)注釋,放出來供大家消化研習(xí)。稍后更新的博文會有關(guān)于輪廓檢測更詳細(xì)的講解。
?
原圖:
運行效果圖:
拖動滾動條,改變threshval(閾值)的值,得到效果迥異的圖片:
想要下載這個程序源工程的童鞋請點擊這里:
?
createTrackbarDemo【 淺墨優(yōu)化&詳細(xì)注釋版】下載
?
另外,在OpenCV路徑opencv_source_code/samples/cpp/connected_components.cpp下,可以找到原版的官方代碼。
?
接著順便講一個配合createTrackbar使用的函數(shù),用于獲取當(dāng)前軌跡條的位置的getTrackbarPos函數(shù)吧。
?
<2>獲取當(dāng)前軌跡條的位置——getTrackbarPos函數(shù)
這個函數(shù)用于獲取當(dāng)前軌跡條的位置并返回。
?
C++: int getTrackbarPos(conststring& trackbarname, conststring& winname);- 第一個參數(shù),const string&類型的trackbarname,表示軌跡條的名字。
- 第二個參數(shù),const string&類型的winname,表示軌跡條的父窗口的名稱。
?這部分大概就是這些了。馬不停蹄地向下一部分進發(fā)吧:)
?
?
?
二、亮度和對比度調(diào)整的理論依據(jù)
?
首先我們給出算子的概念。一般的圖像處理算子都是一個函數(shù),它接受一個或多個輸入圖像,并產(chǎn)生輸出圖像。下式給出了算子的一般形式:
或者
?
今天我們所講解的圖像亮度和對比度的調(diào)整操作,其實屬于圖像處理變換中比較簡單的一種——點操作(pointoperators)。點操作有一個特點,僅僅根據(jù)輸入像素值(有時可加上某些全局信息或參數(shù)),來計算相應(yīng)的輸出像素值。這類算子包括亮度(brightness)和對比度(contrast)調(diào)整,以及顏色校正(colorcorrection)和變換(transformations)。
?
最兩種常用的點操作(或者說點算子),很顯然,是乘上一個常數(shù)(對應(yīng)對比度的調(diào)節(jié))以及加上一個常數(shù)(對應(yīng)亮度值的調(diào)節(jié))。用公式表示出來就是這樣:
?
?
看到這個式子,我們關(guān)于圖像亮度和對比度調(diào)整的策略就呼之欲出了。
其中:
- 參數(shù)f(x)表示源圖像像素。
- 參數(shù)g(x) 表示輸出圖像像素。
- 參數(shù)a(需要滿足a>0)被稱為增益(gain),常常被用來控制圖像的對比度。
- 參數(shù)b通常被稱為偏置(bias),常常被用來控制圖像的亮度。
?
而更近一步,我們這樣改寫這個式子:
其中,i 和 j 表示像素位于第i行 和 第j列 。
那么,這個式子就可以用來作為我們在OpenCV中控制圖像的亮度和對比度的理論公式了。
?
三、關(guān)于訪問圖片中的像素
?
訪問圖片中的像素有很多種方式,以后有機會淺墨會用個專題來講解。目前我們可以先了解下面的這一種。
?
而為了執(zhí)行 ?這個運算??,我們需要訪問圖像的每一個像素。因為是對GBR圖像進行運算,每個像素有三個值(G、B、R),所以我們必須分別訪問它們(PS:OpenCV中的圖像存儲模式為GBR)。以下是訪問像素的代碼片段,三個for循環(huán)解決問題:
?
讓我們分三個方面進行講解:
- 為了訪問圖像的每一個像素,我們使用這樣的語法: image.at<Vec3b>(y,x)[c]
- 其中,y是像素所在的行, x是像素所在的列, c是R、G、B(對應(yīng)0、1、2)其中之一。
- 因為我們的運算結(jié)果可能超出像素取值范圍(溢出),還可能是非整數(shù)(如果是浮點數(shù)的話),所以我們要用saturate_cast對結(jié)果進行轉(zhuǎn)換,以確保它為有效值。
- 這里的a也就是對比度,一般為了觀察的效果,取值為0.0到3.0的浮點值,但是我們的軌跡條一般取值都會整數(shù),所以在這里我們可以,將其代表對比度值的nContrastValue參數(shù)設(shè)為0到300之間的整型,在最后的式子中乘以一個0.01,這樣就可以完成軌跡條中300個不同取值的變化。所以在式子中,我們會看到saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue )中的g_nContrastValue*0.01。
四、圖像對比度、亮度值調(diào)整示例程序
依然是每篇文章都會配給大家的一個詳細(xì)注釋的博文配套示例程序,把這篇文章中介紹的知識點以代碼為載體,展現(xiàn)給大家。
這個示例程序用兩個軌跡條分別控制對比度和亮度值,有一定的可玩性。廢話不多說,上代碼吧:
?
最后看一下運行截圖,運行這個程序會得到兩個圖片顯示窗口。第一個為原圖窗口,第二個為效果圖窗口。在效果圖窗口中可以調(diào)節(jié)兩個軌跡條,來改變當(dāng)前圖片的對比度和亮度。
原圖:
可調(diào)節(jié)的效果圖:
本篇文章到這里就基本結(jié)束了,最后放出本篇文章配套示例程序的下載地址。
本篇文章的配套源代碼請點擊這里下載:
【淺墨OpenCV入門教程之六】配套源代碼下載
OK,本節(jié)的內(nèi)容大概就是這些,我們下篇文章見:)
總結(jié)
以上是生活随笔為你收集整理的转载:【opencv入门教程之六】创建Trackbar图片对比度、亮度值调整的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转载:【OpenCV入门教程之五】 分离
- 下一篇: #转载:十大排序方法,动图展示