整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          一分鐘復(fù)習(xí)-JavaScript基礎(chǔ)語法(2)

          一分鐘復(fù)習(xí)-JavaScript基礎(chǔ)語法(2)

          達(dá)式、運(yùn)算符

          表達(dá)式是JavScript中的一個(gè)短語,Javascript解釋器會(huì)將其計(jì)算出一個(gè)結(jié)果。常量、變量都是一種簡單的表達(dá)式,復(fù)雜表達(dá)式是由簡單表達(dá)式組成的。


          原始表達(dá)式是最簡單的表達(dá)式,是表達(dá)式的最小單位,它們不再包含其他表達(dá)式。JavaScript中的原始表達(dá)式包含常量或直接量、關(guān)鍵詞和變量。


          1.23        // 數(shù)字直接量
          "hello"     // 字符串直接量
          /pattern/   // 正則表達(dá)式直接量

          對象和數(shù)組的初始化表達(dá)式實(shí)際上是一個(gè)新創(chuàng)建的對象和數(shù)組。數(shù)組初始化表達(dá)式是通過一對方括號和其內(nèi)由逗號隔開的列表構(gòu)成的。對象初始化表達(dá)式和數(shù)組初始化表達(dá)式類似,由花括號替代了方括號,并且每個(gè)子表達(dá)式都包含一個(gè)屬性名和一個(gè)冒號作為前綴。

          []                              // 空數(shù)組
          [1+3,3+5]                       // 擁有兩個(gè)元素,第一個(gè)4,第二個(gè)8
          [[2,54],[3+5,78]]               // 支持嵌套
          var a=[3,,,,2]                // 數(shù)組長度5,中間三個(gè)默認(rèn)為undefined
          var b={ x:1, y:2 }            // 對象定義
          var c={}
          c.x=2; c.y=3;               // 定義空對象,并且給對象的x、y屬性賦值
          var d={ x:{x:1, y:2}, y:{}}   // 支持嵌套

          函數(shù)定義表達(dá)式,定義一個(gè)JavaScript函數(shù),表達(dá)式的值是這個(gè)新定義的函數(shù)。

          var func=function(x) { return 2*x }

          屬性訪問表達(dá)式,能夠等到一個(gè)對象的屬性值或者是一個(gè)數(shù)組的元素的值。

          var a={x:1, y:2}
          a.x
          var b=[] 

          調(diào)用表達(dá)式是一種調(diào)用(或是執(zhí)行)函數(shù)或方法的語法表示。

          f(0)                // f是一個(gè)函數(shù)表達(dá)式,0是一個(gè)參數(shù)表達(dá)式
          Math.max(x,y,z)     // Math.max是一個(gè)函數(shù),x、y、z是參數(shù)
          a.sort()            // a.sort是一個(gè)函數(shù),他沒有參數(shù)

          對象創(chuàng)建表達(dá)式創(chuàng)建一個(gè)對象并調(diào)用一個(gè)函數(shù)初始化新對象的屬性。

          new Point(2,3)

          運(yùn)算符

          “+”、“-”,一元運(yùn)算的“+”可以把操作數(shù)轉(zhuǎn)換成數(shù)字,二元運(yùn)算的“+”可以進(jìn)行數(shù)字或是字符串操作,一元運(yùn)算的“-”可以把操作數(shù)轉(zhuǎn)換成數(shù)字后改變成相反值,二元運(yùn)算的“-”可以進(jìn)行數(shù)字操作。

          var a=+'5'                //=> 5
          var b='say' + 'hello'     //=> sayHello
          var c=-'5'                //=> -5
          var d=9 - 4               //=> 5

          “++”遞增、“--”遞減,對操作數(shù)進(jìn)行加一(減一),如果在操作數(shù)左邊,則會(huì)先操作操作數(shù)后返回值。如果在操作數(shù)右邊,則會(huì)先返回值,后對操作數(shù)操作。

          var i=1, j=++i;     // i和j的值都是2
          var i=1, j=i++;     // i是2,j是i
          var k=1, k--;         // k是0

          “&”按位與,對整型進(jìn)行逐位執(zhí)行布爾與(AND),同時(shí)為1,結(jié)果才為1。

          var a=0x1234 & 0x00FF //=> 0x0034

          “|”按位或,對整型進(jìn)行逐位執(zhí)行布爾或(OR),有一個(gè)為1,結(jié)果就為1。

          var a=0x1234 & 0x00FF //=> 0x12FF

          “^”按位異或,對整型進(jìn)行逐位比對,如果相同則為0,如果不同則為1。

          var a=0xFF00 ^ 0xF0F0 //=> 0x012FF

          “~”按位非,對整型進(jìn)行逐位取反。

          var a=~0x0F //=> 0xFFFFFFF0

          “<<”左移,將操作數(shù)的所有二進(jìn)制位向左移動(dòng)0~31之間的整數(shù)位,右邊填充0,從右往左數(shù)超過31位的舍棄。

          var a=7<<2    //=> 28

          “>>”帶符號右移,將操作數(shù)的所有二進(jìn)制位向右移動(dòng)0~31之間的整數(shù)位,左邊填充0,從左往右數(shù)超過31位的舍棄。如果原來是正數(shù),最高位為0,如果原來是負(fù)數(shù),最高位為1。

          var a=7>>1    //=> 3
          var b=-7>>1   //=> -4

          “>>>”無符號右移,將操作數(shù)的所有二進(jìn)制位向右移動(dòng)0~31之間的整數(shù)位,左邊填充0,從左往右數(shù)超過31位的舍棄。

          var a=-1>>>4    //=> 0x0FFFFFFF

          “==”等于、“===”恒等于、“!=”不等于、“!==”恒不等于,“==”、“===”都是判斷左右兩邊的操作數(shù)是否相等,但是“===”更為嚴(yán)格?!?=”、“!==”的結(jié)果是對“==”、“===”取反。

          “==”等于

          1==2              //=> false
          1=='1'            //=> true:會(huì)先把右邊的轉(zhuǎn)型成整型,再進(jìn)行比較
          null==undefined   //=> true
          NaN===NaN         //=> false:NaN不等于任何東西,即使是自己也不相等
          true==1           //=> true:會(huì)把左邊的true轉(zhuǎn)型成整型1,false則為0
          class a{
              toString(){
                  return 1
              }
              valueOf(){
                  return -1
              }
          }
          
          var b=new a()
          console.log(b>0)
          // 對象和數(shù)字字符串比較,會(huì)兩邊轉(zhuǎn)型成整型,對象轉(zhuǎn)成原始類型,會(huì)依次調(diào)用valueOf(),如果得不到,接著會(huì)調(diào)用toString(),還不行則為false。

          “===”恒等于

          1===2                 //=> false
          1==='1'               //=> false:類型不相等,即使轉(zhuǎn)型后相等也是不相等

          “<”小于、“>”大于、“<=”小于等于、“>=”大于等于,比較左右兩邊值大小,支持整型、字符串比較大小。

          var a=7
          a > 6
          a < '4'
          a >=15
          a <=88

          “in”存在,判斷右邊的對象的屬性名中,是否存在左邊的字符串(或是可以轉(zhuǎn)換成字符串)同名的屬性。

          var point={ x:1, y:2 }    // 定義一個(gè)對象
          "x" in point                //=> true:對象有一個(gè)名為"x"的屬性
          "z" in point                //=> false:對象不存在名為“z”的屬性
          var data=[5, 6, 7]        // 擁有三個(gè)元素的數(shù)組
          "0" in data                 //=> true:數(shù)組中存在0數(shù)組下標(biāo)
          1 in data                   //=> true:數(shù)組中存在1數(shù)組下標(biāo)
          3 in data                   //=> false:數(shù)組中不存在3數(shù)組下標(biāo)

          “instanceof”類型比較,比較左邊對象的類型是否是右邊指定的類型。

          var a=new Date()
          a instanceof Date
          a instanceof Object     //=> true:所有對象都是Object實(shí)例
          a instanceof Number     //=> false

          “&&”邏輯與,把左右兩邊的表達(dá)式計(jì)算出結(jié)果后,并轉(zhuǎn)型成布爾型,只有左右同時(shí)為true的時(shí)候,才能返回true。

          true && false   //=> false
          (1>0) && (0<1)  //=> true

          “||”邏輯或,把左右兩邊的表達(dá)式計(jì)算出結(jié)果后,并轉(zhuǎn)型成布爾型,只有左右存在一個(gè)或是以上的true的時(shí)候,才能返回true。

          true || false   //=> true
          (1<0) || (0>1)  //=> false

          “!”邏輯非,把右邊的表達(dá)式計(jì)算出結(jié)果后,并轉(zhuǎn)型成布爾型,然后對布爾型結(jié)果取反。

          !true   //=> false
          !(1<0)  //=> true

          “=”賦值,把右邊的值賦予左邊的變量。

          var a=2
          var b=1
          a+=b        // 等價(jià)于a=a+b
          a-=b        // 等價(jià)于a=a-b
          a*=b        // 等價(jià)于a=a*b
          a/=b        // 等價(jià)于a=a/b
          a%=b        // 等價(jià)于a=a%b
          a<<=b       // 等價(jià)于a=a<<b
          a>>=b       // 等價(jià)于a=a>>b
          a>>>=b      // 等價(jià)于a=a>>>b
          a&=b        // 等價(jià)于a=a&b
          a|=b        // 等價(jià)于a=a|b
          a^=b        // 等價(jià)于a=a^b

          eval(),只有一個(gè)參數(shù),如果傳入的不是字符串,他直接返回參數(shù)。如果是,則會(huì)把字符串當(dāng)成JavaScript代碼進(jìn)行編譯,編譯失敗返回異常,成功則執(zhí)行,返回結(jié)果。eval()使用了調(diào)用它的變量作用域環(huán)境。

          “?:”,JavaScript中唯一的三元運(yùn)算,A?B:C,如果A為true,則返回B,反之則返回C。

          var a=1>0?5:3     //=> 5

          “typeof”,獲取操作數(shù)的類型對應(yīng)的字符串。

          var a=1
          typeof a                //=> "number"
          typeof undefined        //=> "undefined"
          typeof null             //=> "object"
          typeof true             //=> "boolean"
          typeof 1                //=> "number":NaN也屬于number
          typeof "hello"          //=> "string"
          var b=function(){}
          typeof b                //=> "function"
          typeof {}               //=> "object"

          “delete”刪除符,用來刪除對象屬性或者數(shù)組元素。

          var point={ x:1, y:2}
          delete point.x
          "x" in point            //=> false:屬性已經(jīng)被刪除了
          var a=[1,2,3]
          delete a[2]
          2 in a                  //=> false:下標(biāo)2的元素已經(jīng)被刪除了

          “void”,會(huì)使程序忽略右邊的操作數(shù)的返回結(jié)果,常見的是放在a標(biāo)簽里面。

          <a href="javascript:void window.open()">打開一個(gè)新的窗口</a>

          “,”逗號運(yùn)算符,會(huì)先計(jì)算左邊操作數(shù),再計(jì)算右邊操作數(shù),最后返回右邊操作數(shù)的值。

          Ctrl+F10可最大化或還原選定的工作簿窗口。?F11創(chuàng)建當(dāng)前范圍內(nèi)數(shù)據(jù)的圖表。?按Shift+F11可插入一個(gè)新工作表。

          按Alt+F11將打開VisualBasic編輯器,您可以在其中通過使用VisualBasicforApplications(VBA)來創(chuàng)建宏。

          按Alt+Shift+F11將打開Microsoft腳本編輯器,您可以在其中添加文本、編輯HTML標(biāo)記以及修改任何腳本代碼。?F12顯示“另存為”對話框。

          Excel表格其他有用的快捷鍵?按鍵說明

          箭頭鍵在工作表中上移、下移、左移或右移一個(gè)單元格。

          按Ctrl+箭頭鍵可移動(dòng)到工作表中當(dāng)前數(shù)據(jù)區(qū)域(數(shù)據(jù)區(qū)域:包含數(shù)據(jù)的單元格區(qū)域,該區(qū)域周圍為空白單元格或數(shù)據(jù)表邊框。)的邊緣。

          按Shift+箭頭鍵可將單元格的選定范圍擴(kuò)大一個(gè)單元格。

          按Ctrl+Shift+箭頭鍵可將單元格的選定范圍擴(kuò)展到與活動(dòng)單元格同一列或同一行中的最后一個(gè)非空白單元格。

          當(dāng)菜單處于可見狀態(tài)時(shí),按向左鍵或向右鍵可選擇左邊或右邊的菜單。當(dāng)子菜單處于打開狀態(tài)時(shí),按這些箭頭鍵可在主菜單和子菜單之間切換。

          當(dāng)菜單或子菜單處于打開狀態(tài)時(shí),按向下鍵或向上鍵可選擇下一個(gè)或上一個(gè)命令。?在對話框中,按箭頭鍵可在打開的下拉列表中的各個(gè)選項(xiàng)之間移動(dòng),或在一組選項(xiàng)的各個(gè)選項(xiàng)之間移動(dòng)。

          按Alt+向下鍵可打開選定的下拉列表。?Backspace在編輯欄中刪除左邊的一個(gè)字符。?也可清除活動(dòng)單元格的內(nèi)容。

          Delete從選定單元格中刪除單元格內(nèi)容(數(shù)據(jù)和公式),而不會(huì)影響單元格格式或批注。?在單元格編輯模式下,按該鍵將會(huì)刪除插入點(diǎn)右邊的字符。?End當(dāng)ScrollLock處于開啟狀態(tài)時(shí),移動(dòng)到窗口右下角的單元格。?當(dāng)菜單或子菜單處于可見狀態(tài)時(shí),也可選擇菜單上的最后一個(gè)命令。

          按Ctrl+End可移動(dòng)到工作表上的最后一個(gè)單元格,即所使用的最下方一行與所使用的最右邊一列的交匯單元格。

          按Ctrl+Shift+End可將單元格的選定范圍擴(kuò)展到工作表上所使用的最后一個(gè)單元格(右下角)。

          Enter從單元格或編輯欄中完成單元格輸入,并(默認(rèn))選擇下面的單元格。?在數(shù)據(jù)表單中,按該鍵可移動(dòng)到下一條記錄中的第一個(gè)字段。?打開選定的菜單(按F10激活菜單欄),或執(zhí)行選定命令的操作。

          在對話框中,按該鍵可執(zhí)行對話框中默認(rèn)命令按鈕(帶有突出輪廓的按鈕,通常為“確定”按鈕)的操作。

          按Alt+Enter可在同一單元格中另起一個(gè)新行。

          按Ctrl+Enter可使用當(dāng)前條目填充選定的單元格區(qū)域。?按Shift+Enter可完成單元格輸入并選擇上面的單元格。?Esc取消單元格或編輯欄中的輸入。

          按該鍵也可關(guān)閉打開的菜單或子菜單、對話框或消息窗口。?Home移到工作表中某一行的開頭。

          當(dāng)ScrollLock處于開啟狀態(tài)時(shí),移到窗口左上角的單元格。?當(dāng)菜單或子菜單處于可見狀態(tài)時(shí),選擇菜單上的第一個(gè)命令。?按Ctrl+Home可移到工作表的開頭。

          按Ctrl+Shift+Home可將單元格的選定范圍擴(kuò)展到工作表的開頭。?PageDown在工作表中下移一個(gè)屏幕。

          按Alt+PageDown可在工作表中向右移動(dòng)一個(gè)屏幕。?按Ctrl+PageDown可移到工作簿中的下一個(gè)工作表。

          按Ctrl+Shift+PageDown可選擇工作簿中的當(dāng)前和下一個(gè)工作表。?PageUp在工作表中上移一個(gè)屏幕。

          按Alt+PageUp可在工作表中向左移動(dòng)一個(gè)屏幕。?按Ctrl+PageUp可移到工作簿中的上一個(gè)工作表。

          按Ctrl+Shift+PageUp可選擇工作簿中的當(dāng)前和上一個(gè)工作表。?空格鍵在對話框中,執(zhí)行選定按鈕的操作,或者選中或清除復(fù)選框。?按Ctrl+空格鍵可選擇工作表中的整列。?按Shift+空格鍵可選擇工作表中的整行。?按Ctrl+Shift+空格鍵可選擇整個(gè)工作表。

          如果工作表包含數(shù)據(jù),則按Ctrl+Shift+空格鍵將選擇當(dāng)前區(qū)域。再按一次Ctrl+Shift+空格鍵將選擇整個(gè)工作表。

          當(dāng)某個(gè)對象處于選定狀態(tài)時(shí),按Ctrl+Shift+空格鍵可選擇工作表上的所有對象。?按Alt+空格鍵可顯示Excel窗口的“控制”菜單。?Tab在工作表中向右移動(dòng)一個(gè)單元格。

          在受保護(hù)的工作表中,可在未鎖定的單元格之間移動(dòng)。?在對話框中,移到下一個(gè)選項(xiàng)或選項(xiàng)組。

          按Shift+Tab可移到前一個(gè)單元格(在工作表中)或前一個(gè)選項(xiàng)(在對話框中)。?在對話框中,按Ctrl+Tab可切換到下一個(gè)選項(xiàng)卡。?在對話框中,按Ctrl+Shift+Tab可切換到前一個(gè)選項(xiàng)卡。

          Excel表格Ctrl組合快捷鍵?按鍵說明?Ctrl+(取消隱藏選定范圍內(nèi)所有隱藏的行。?Ctrl+)取消隱藏選定范圍內(nèi)所有隱藏的列。?Ctrl+&將外框應(yīng)用于選定單元格。?Ctrl+_從選定單元格刪除外框。?Ctrl+~應(yīng)用“常規(guī)”數(shù)字格式。

          標(biāo)

          在本教程中, 你將學(xué)習(xí)到以下內(nèi)容:

          • 訪問像素值;
          • 用零初始化矩陣;
          • 學(xué)習(xí)CV :: saturate_cast的作用及其有用的原因;
          • 學(xué)習(xí)有關(guān)像素變換的很酷的知識(shí);
          • 提高圖像亮度的實(shí)例。

          理論



          下述解釋援引自理查德·斯?jié)衫够?Richard Szeliski)的<<計(jì)算機(jī)視覺算法和應(yīng)用>>一書。

          圖像處理

          常用的圖像處理操作是一個(gè)函數(shù),它將一個(gè)或多個(gè)圖像作為輸入并生成輸出圖像。

          • 圖像變可被視為:
          • 點(diǎn)運(yùn)算符(像素變換);
          • 鄰近(基于區(qū)域的)運(yùn)算符。

          像素變換

          • 在圖像處理中, 每個(gè)輸出像素的值僅取決于相應(yīng)的輸入像素值(可能還包括一些全局收集的信息或參數(shù));
          • 此類操作實(shí)例包括亮度調(diào)整、對比度調(diào)整以及顏色的校正和轉(zhuǎn)換。

          亮度和對比度調(diào)整

          兩種常用對比度調(diào)整的方法是將像素值乘以或加上一個(gè)常數(shù):

          • 參數(shù)α > 0和β通常稱為增益參數(shù)和偏置參數(shù),通過這兩個(gè)參數(shù)分別來控制對比度和亮度。
          • F ( X )為源圖像的像素,G ( X )為輸出圖像的像素??梢苑奖愕貙懗鲆韵卤磉_(dá)式:

          • 其中i和j表示位于第i行,第j列的像素。

          代碼

          C ++

          (Java 版本請?jiān)L問:

          https://github.com/opencv/opencv/blob/master/samples/java/tutorial_code/ImgProc/changing_contrast_brightness_image/BasicLinearTransformsDemo.java

          Python 版本請?jiān)L問:

          https://github.com/opencv/opencv/blob/master/samples/python/tutorial_code/imgProc/changing_contrast_brightness_image/BasicLinearTransforms.py)

          • 原文可下載源代碼(地址在文末)
          • 下面的代碼執(zhí)行g(shù)(i,j)=α?f(i,j)+β操作

          代碼詳解

          C ++

          使用CV :: imread加載圖像并將其保存到Mat對象中:


          接下來,對該圖像做一些轉(zhuǎn)換,為此需要?jiǎng)?chuàng)建一個(gè)新的Mat對象來存放它。此外,我們希望它具備以下特征:

          • 初始像素值為零;
          • 與原始圖像相同的尺寸和數(shù)據(jù)類型。


          cv::Mat::zeros返回一個(gè)基于image.size()和image.type() 的Matlab格式的零初始化值。

          • 我們現(xiàn)在要求用戶輸入α和β值:


          • 為了執(zhí)行g(shù)(i,j)=α?f(i,j)+β操作,我們必須訪問圖像的每個(gè)像素。由于是對BGR圖像進(jìn)行操作,所以每個(gè)像素包含(B,G和R)三個(gè)值,我們必須分別訪問它們。具體代碼如下:


          注意(只適用于C ++代碼):

          • 我們利用 image.at<Vec3b>(y,x)[c]來訪問圖像的各個(gè)像素,其中?是行號, X是列號,C是B,G或R(0,1或2);
          • 由于α?p(i,j)+β 操作的值可能溢出或?yàn)榉钦麛?shù)(如α是浮點(diǎn)數(shù)),我們用CV :: saturate_cast來確保該值的有效性;
          • 最后,我們用以下方式創(chuàng)建窗口并顯示圖像。


          我們利用以下簡單的命令來取代for循環(huán)來訪問圖像的每個(gè)像素


          cv::Mat::convertTo將執(zhí)行*new_image=a*image + beta*操作.。但是,我們想向你展示如何訪問每個(gè)像素。在任何情況下,這兩種方法都給出相同的結(jié)果,但 convertTo 更加優(yōu)化并且工作速度更快。

          結(jié)果

          我們不運(yùn)行代碼,設(shè)置α=2.2和β=50。

          實(shí)例

          在本小節(jié)中,我們將以前學(xué)到的技巧付諸實(shí)戰(zhàn),通過調(diào)整圖像的亮度和對比度來校正曝光不足的圖片。同時(shí),學(xué)習(xí)利用伽瑪校正(gamma correction)技術(shù)來校正圖像的亮度。

          圖像亮度和對比度調(diào)整

          增大(或減?。?β值將加大(/減?。└鱾€(gè)像素的對比度。像素值超出 [0; 255]范圍之外的值將會(huì)飽和(即:大于255,或小于0的像素值將鉗位到255或 0)。


          原始圖像的淺灰色直方圖中,深灰色亮度=80 GIMP
          直方圖表示該色彩像素中每種色彩的數(shù)目。深色圖像的像素值將大于淺色圖像的像素值,因此直方圖的左半部分會(huì)出現(xiàn)一個(gè)峰值。當(dāng)添加一個(gè)恒定的偏差之后,整個(gè)直方圖右移,為所有的像素增加了一個(gè)恒定的偏置。
          修改參數(shù)α將修改水平軸的展幅,如果α <1中,色彩值將被壓縮,其結(jié)果是圖像的對比度降低。


          原圖像的淺灰色直方圖中,深灰色時(shí), 對比度GIMP <0
          注意,利用對比度/亮度工具Gimp獲得的上述柱狀圖,亮度工具的偏置參數(shù)β應(yīng)該與之相同,但對比度工具的增益參數(shù)α是不同的(可以從前面的直方圖中看出)。
          調(diào)整偏置參數(shù)β可以提高亮度,但同時(shí),圖像的對比度會(huì)下降,圖像上似乎會(huì)蒙上一層輕微的面紗。調(diào)整增益α增益可緩釋這種效果,但是由于出現(xiàn)飽和,圖像將失去原有明亮區(qū)域的一些細(xì)節(jié)。

          伽瑪校正

          伽瑪校正利用輸入值和輸出映射值之間的非線性變換,校正圖像的亮度:



          由于這種關(guān)系是非線性的,其效果不會(huì)影響所有的像素,最終輸出將取決于像素的原始值。


          打印出不同的伽瑪值(gamma)
          當(dāng)γ <1時(shí),,原始圖像的暗區(qū)將變得更加明亮,整個(gè)直方圖將右移;當(dāng)γ > 1時(shí), 原始圖像的亮區(qū)將變得更暗,整個(gè)直方圖將左移。

          糾正曝光不足的圖像

          我們設(shè)置α=1.3和β=40修正下面的圖像。

          圖: Visem的作品 [CC BY-SA 3.0],來源:維基共享資源


          圖像的整體亮度得到了改善,但可以看出: 由于色彩的像素?cái)?shù)值飽和,圖中云彩已經(jīng)飽和(攝影高光修剪)。
          我們用γ=0.4修正下面的圖像。

          圖: Visem的作品 [CC BY-SA 3.0],來源:維基共享資源
          由于映射是非線性的,伽馬校正添加了少量的飽和效應(yīng),并且不存在前面所述方法的數(shù)值飽問題。

          左邊:α,β校正后的直方圖;中間:原始圖像的直方圖;右邊:伽馬校正后的直方圖
          上圖比較了三幅圖像(三個(gè)直方圖的y值不相同)的直方圖。從中可以發(fā)現(xiàn),大部分的像素值都在原始圖像直方圖的下部。α , β修正后,由于圖像出現(xiàn)飽和,在255 處可以觀察到一個(gè)峰值,整個(gè)直方圖右移。伽瑪校正后,直方圖右移,圖像暗區(qū)域中的像素移動(dòng)的位移比在明亮區(qū)域像素移動(dòng)的位移更大(見伽瑪曲線圖)。
          在本教程中,描述了兩種調(diào)整圖像對比度和亮度簡單的方法。它們只是基本技術(shù),不能用作光柵圖形編輯器的替代品!

          代碼

          C ++

          教程的源代碼請?jiān)L問原文(地址在文末)
          伽馬校正的源代碼Code:


          在這里,由于一次只需要計(jì)算256 個(gè)數(shù)值,利用查找表來提高計(jì)算性能。

          更多資源

          圖形渲染中的伽瑪校正

          CRT監(jiān)視器的伽瑪校正和圖像顯示

          數(shù)字曝光技術(shù)


          注:本文以C++語言代碼為例,獲取Java和python版本可在原文中查看:

          https://docs.opencv.org/4.5.2/d3/dc1/tutorial_basic_linear_transform.html


          主站蜘蛛池模板: 久久精品无码一区二区日韩AV| 精品一区二区三区3d动漫| 国产精品女同一区二区| 国产香蕉一区二区在线网站| 97一区二区三区四区久久| 日韩熟女精品一区二区三区 | 怡红院一区二区三区| 在线播放国产一区二区三区| 国产免费一区二区三区免费视频| 日韩在线视频一区二区三区| 免费一本色道久久一区| 日韩精品区一区二区三VR| 无码国产精品一区二区免费16| 人妻无码一区二区不卡无码av | 日韩av片无码一区二区不卡电影| 久久久久久人妻一区二区三区| 日本一区二区视频| 国产综合无码一区二区色蜜蜜| 国产在线一区二区三区在线| 久久综合精品国产一区二区三区| 国产爆乳无码一区二区麻豆| 精品无码一区二区三区爱欲九九| 亚洲欧美日韩国产精品一区 | 亚洲欧美日韩国产精品一区| 日本一区二区三区精品视频| 中文国产成人精品久久一区| 国产在线精品一区二区中文| 亚洲日韩一区精品射精| 久久久国产一区二区三区 | 一区二区三区无码被窝影院| 国产精品亚洲一区二区三区| 精品国产免费一区二区三区香蕉| 亚洲AV综合色一区二区三区| 亚洲国产成人久久综合一区77| 一区国严二区亚洲三区| 99精品久久精品一区二区| 精品视频在线观看一区二区| 亚洲精品伦理熟女国产一区二区 | 福利一区二区在线| 国产视频一区二区在线观看| 无码国产精品一区二区免费式影视|