OpenCV 對比度增強之線性變換

2021-09-30 17:45:39 字數 1637 閱讀 8125

原理講解

輸入的影象為i,寬為w,高為h,輸出影象記為o,影象的線性變換可以利用以下公式定義:

當a=1,b=0時,o為i的乙個副本;

如果a>1則輸出影象o的對比度比i有所增大;

如果00時,亮度增加;當b<0時,亮度減小。

舉例:假設影象的灰度級範圍是[50,100],通過a=2,b=0的線性變換,可以將輸出影象的灰度級拉伸到[100,200],灰度級範圍有所增加, 從而提高了對比度;而如果令a=0.5,b=0,則輸出影象的灰度級會壓縮到[25,50],灰度級範圍有所減小,則降低了對比度。

實現方式

在opencv中實現乙個常數與矩陣相乘有多種方式。

第一種方式:通過mat的成員函式

mat::convertto(outputarray m, int rtype,double alpha=1,double beta=0)

實現線性變換,該函式引數之間的關係如下:

m(x,y)=saturate_cast(alpha(*this)(x,y)+beta)
其中引數m代表輸出矩陣,引數rtype是輸出矩陣m的資料型別,引數alpha和beta分別可以理解為線性變換中的a和b.利用該函式實現線性變換的示例**如下:

mat i = (mat_(2,2)<<0,200,23,4);

mat o;

i.convertto(0,cv_8uc1,2.0,0);

其中輸入的i的資料型別為uchar,列印輸出o的值,結果為:[[0,255],[46,8]] 也就是當輸出矩陣的資料型別是cv_8u時,大於255的值會自動截斷為255.

第二種方式:使用乘法運算子"*",仍然使用上述**中的輸入矩陣i,**如下:

mat o =3.5*i
輸出矩陣o的值為[[0,255],[80,14]],使用乘法運算子」*「,無論常數是什麼資料型別,輸出矩陣的資料型別總是和輸入矩陣的資料型別相同,當資料型別是cv_8u時,在返回值中將大於255的值自動截斷為255.第三種方式:利用opencv提供的函式

convertscaleabs(inputarray src,outputarray dst, double alpha=1,double beta=0)

其中引數的關係為dst=alpha*src+beta, dst的資料型別和輸入矩陣src的資料型別是相同的。示例**如下

mat i=(mat_(2,2)<<0,200,23,4);

mat 0;

convertscaleabs(i,o,2.0,0);

以上線性變換是對整個灰度級範圍使用了相同的引數,有的時候也需要針對不用的灰度級範圍進行不同的線性變換,這就是常用的分段線性變換,經常用於降低較亮或較暗區域的對比度來增強灰度級處於中間範圍的對比度,或者壓低中間灰度級處的對比度來增強較亮或較暗區域的對比度。

線性變換的引數需要根據不同的應用及影象自身的資訊進行合理的選擇,對於a和b的值需要進行多次的測試。

線性對比度增強 C GDAL庫)

include gdal priv.h include cpl conv.h include include using namespace cv using namespace std void createrasterfile 輸出影象的格式資訊 cout driver getdriver ge...

python OpenCV之對比度增強

對比度指的是一幅影象中明暗區域最亮的白和最暗的黑之間不同亮度層級的測量,差異範圍越大代表對比越大,差異範圍越小代表對比越小。對比度增強技術主要解決影象灰度級範圍較小造成的對比度低問題,目的是將影象的灰度級放大到指定的程度,使影象中的細節看起來更加清晰。概念 灰度直方圖是影象灰度級的函式,用來描述每個...

對比度增強(一) 線性變換

線性變換 影象為i,寬為w,高為h,輸出影象記為o,影象的線性變換可以利用一下公式定義 o r,c a i r,c b 0 r h,0 c w 當a 1,b 0時,o為i的乙個副本 如果a 1,則輸出影象o的對比度比i有所增加 如果0 a 1,則o的對比度比i有所減小。而b值的改變,影響的是輸出影象...