達(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ù)字格式。
在本教程中, 你將學(xué)習(xí)到以下內(nèi)容:
注
下述解釋援引自理查德·斯?jié)衫够?Richard Szeliski)的<<計(jì)算機(jī)視覺算法和應(yīng)用>>一書。
兩種常用對比度調(diào)整的方法是將像素值乘以或加上一個(gè)常數(shù):
(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)
使用CV :: imread加載圖像并將其保存到Mat對象中:
接下來,對該圖像做一些轉(zhuǎn)換,為此需要?jiǎng)?chuàng)建一個(gè)新的Mat對象來存放它。此外,我們希望它具備以下特征:
cv::Mat::zeros返回一個(gè)基于image.size()和image.type() 的Matlab格式的零初始化值。
注意(只適用于C ++代碼):
注我們利用以下簡單的命令來取代for循環(huán)來訪問圖像的每個(gè)像素:
cv::Mat::convertTo將執(zhí)行*new_image=a*image + beta*操作.。但是,我們想向你展示如何訪問每個(gè)像素。在任何情況下,這兩種方法都給出相同的結(jié)果,但 convertTo 更加優(yōu)化并且工作速度更快。
我們不運(yùn)行代碼,設(shè)置α=2.2和β=50。
在本小節(jié)中,我們將以前學(xué)到的技巧付諸實(shí)戰(zhàn),通過調(diào)整圖像的亮度和對比度來校正曝光不足的圖片。同時(shí),學(xué)習(xí)利用伽瑪校正(gamma correction)技術(shù)來校正圖像的亮度。
增大(或減?。?β值將加大(/減?。└鱾€(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ù),不能用作光柵圖形編輯器的替代品!
教程的源代碼請?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
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。