Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
達式、運算符
表達式是JavScript中的一個短語,Javascript解釋器會將其計算出一個結果。常量、變量都是一種簡單的表達式,復雜表達式是由簡單表達式組成的。
原始表達式是最簡單的表達式,是表達式的最小單位,它們不再包含其他表達式。JavaScript中的原始表達式包含常量或直接量、關鍵詞和變量。
1.23 // 數字直接量
"hello" // 字符串直接量
/pattern/ // 正則表達式直接量
對象和數組的初始化表達式實際上是一個新創建的對象和數組。數組初始化表達式是通過一對方括號和其內由逗號隔開的列表構成的。對象初始化表達式和數組初始化表達式類似,由花括號替代了方括號,并且每個子表達式都包含一個屬性名和一個冒號作為前綴。
[] // 空數組
[1+3,3+5] // 擁有兩個元素,第一個4,第二個8
[[2,54],[3+5,78]] // 支持嵌套
var a=[3,,,,2] // 數組長度5,中間三個默認為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:{}} // 支持嵌套
函數定義表達式,定義一個JavaScript函數,表達式的值是這個新定義的函數。
var func=function(x) { return 2*x }
屬性訪問表達式,能夠等到一個對象的屬性值或者是一個數組的元素的值。
var a={x:1, y:2}
a.x
var b=[]
調用表達式是一種調用(或是執行)函數或方法的語法表示。
f(0) // f是一個函數表達式,0是一個參數表達式
Math.max(x,y,z) // Math.max是一個函數,x、y、z是參數
a.sort() // a.sort是一個函數,他沒有參數
對象創建表達式創建一個對象并調用一個函數初始化新對象的屬性。
new Point(2,3)
運算符
“+”、“-”,一元運算的“+”可以把操作數轉換成數字,二元運算的“+”可以進行數字或是字符串操作,一元運算的“-”可以把操作數轉換成數字后改變成相反值,二元運算的“-”可以進行數字操作。
var a=+'5' //=> 5
var b='say' + 'hello' //=> sayHello
var c=-'5' //=> -5
var d=9 - 4 //=> 5
“++”遞增、“--”遞減,對操作數進行加一(減一),如果在操作數左邊,則會先操作操作數后返回值。如果在操作數右邊,則會先返回值,后對操作數操作。
var i=1, j=++i; // i和j的值都是2
var i=1, j=i++; // i是2,j是i
var k=1, k--; // k是0
“&”按位與,對整型進行逐位執行布爾與(AND),同時為1,結果才為1。
var a=0x1234 & 0x00FF //=> 0x0034
“|”按位或,對整型進行逐位執行布爾或(OR),有一個為1,結果就為1。
var a=0x1234 & 0x00FF //=> 0x12FF
“^”按位異或,對整型進行逐位比對,如果相同則為0,如果不同則為1。
var a=0xFF00 ^ 0xF0F0 //=> 0x012FF
“~”按位非,對整型進行逐位取反。
var a=~0x0F //=> 0xFFFFFFF0
“<<”左移,將操作數的所有二進制位向左移動0~31之間的整數位,右邊填充0,從右往左數超過31位的舍棄。
var a=7<<2 //=> 28
“>>”帶符號右移,將操作數的所有二進制位向右移動0~31之間的整數位,左邊填充0,從左往右數超過31位的舍棄。如果原來是正數,最高位為0,如果原來是負數,最高位為1。
var a=7>>1 //=> 3
var b=-7>>1 //=> -4
“>>>”無符號右移,將操作數的所有二進制位向右移動0~31之間的整數位,左邊填充0,從左往右數超過31位的舍棄。
var a=-1>>>4 //=> 0x0FFFFFFF
“==”等于、“===”恒等于、“!=”不等于、“!==”恒不等于,“==”、“===”都是判斷左右兩邊的操作數是否相等,但是“===”更為嚴格。“!=”、“!==”的結果是對“==”、“===”取反。
“==”等于
1==2 //=> false
1=='1' //=> true:會先把右邊的轉型成整型,再進行比較
null==undefined //=> true
NaN===NaN //=> false:NaN不等于任何東西,即使是自己也不相等
true==1 //=> true:會把左邊的true轉型成整型1,false則為0
class a{
toString(){
return 1
}
valueOf(){
return -1
}
}
var b=new a()
console.log(b>0)
// 對象和數字字符串比較,會兩邊轉型成整型,對象轉成原始類型,會依次調用valueOf(),如果得不到,接著會調用toString(),還不行則為false。
“===”恒等于
1===2 //=> false
1==='1' //=> false:類型不相等,即使轉型后相等也是不相等
“<”小于、“>”大于、“<=”小于等于、“>=”大于等于,比較左右兩邊值大小,支持整型、字符串比較大小。
var a=7
a > 6
a < '4'
a >=15
a <=88
“in”存在,判斷右邊的對象的屬性名中,是否存在左邊的字符串(或是可以轉換成字符串)同名的屬性。
var point={ x:1, y:2 } // 定義一個對象
"x" in point //=> true:對象有一個名為"x"的屬性
"z" in point //=> false:對象不存在名為“z”的屬性
var data=[5, 6, 7] // 擁有三個元素的數組
"0" in data //=> true:數組中存在0數組下標
1 in data //=> true:數組中存在1數組下標
3 in data //=> false:數組中不存在3數組下標
“instanceof”類型比較,比較左邊對象的類型是否是右邊指定的類型。
var a=new Date()
a instanceof Date
a instanceof Object //=> true:所有對象都是Object實例
a instanceof Number //=> false
“&&”邏輯與,把左右兩邊的表達式計算出結果后,并轉型成布爾型,只有左右同時為true的時候,才能返回true。
true && false //=> false
(1>0) && (0<1) //=> true
“||”邏輯或,把左右兩邊的表達式計算出結果后,并轉型成布爾型,只有左右存在一個或是以上的true的時候,才能返回true。
true || false //=> true
(1<0) || (0>1) //=> false
“!”邏輯非,把右邊的表達式計算出結果后,并轉型成布爾型,然后對布爾型結果取反。
!true //=> false
!(1<0) //=> true
“=”賦值,把右邊的值賦予左邊的變量。
var a=2
var b=1
a+=b // 等價于a=a+b
a-=b // 等價于a=a-b
a*=b // 等價于a=a*b
a/=b // 等價于a=a/b
a%=b // 等價于a=a%b
a<<=b // 等價于a=a<<b
a>>=b // 等價于a=a>>b
a>>>=b // 等價于a=a>>>b
a&=b // 等價于a=a&b
a|=b // 等價于a=a|b
a^=b // 等價于a=a^b
eval(),只有一個參數,如果傳入的不是字符串,他直接返回參數。如果是,則會把字符串當成JavaScript代碼進行編譯,編譯失敗返回異常,成功則執行,返回結果。eval()使用了調用它的變量作用域環境。
“?:”,JavaScript中唯一的三元運算,A?B:C,如果A為true,則返回B,反之則返回C。
var a=1>0?5:3 //=> 5
“typeof”,獲取操作數的類型對應的字符串。
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”刪除符,用來刪除對象屬性或者數組元素。
var point={ x:1, y:2}
delete point.x
"x" in point //=> false:屬性已經被刪除了
var a=[1,2,3]
delete a[2]
2 in a //=> false:下標2的元素已經被刪除了
“void”,會使程序忽略右邊的操作數的返回結果,常見的是放在a標簽里面。
<a href="javascript:void window.open()">打開一個新的窗口</a>
“,”逗號運算符,會先計算左邊操作數,再計算右邊操作數,最后返回右邊操作數的值。
Ctrl+F10可最大化或還原選定的工作簿窗口。?F11創建當前范圍內數據的圖表。?按Shift+F11可插入一個新工作表。
按Alt+F11將打開VisualBasic編輯器,您可以在其中通過使用VisualBasicforApplications(VBA)來創建宏。
按Alt+Shift+F11將打開Microsoft腳本編輯器,您可以在其中添加文本、編輯HTML標記以及修改任何腳本代碼。?F12顯示“另存為”對話框。
Excel表格其他有用的快捷鍵?按鍵說明
箭頭鍵在工作表中上移、下移、左移或右移一個單元格。
按Ctrl+箭頭鍵可移動到工作表中當前數據區域(數據區域:包含數據的單元格區域,該區域周圍為空白單元格或數據表邊框。)的邊緣。
按Shift+箭頭鍵可將單元格的選定范圍擴大一個單元格。
按Ctrl+Shift+箭頭鍵可將單元格的選定范圍擴展到與活動單元格同一列或同一行中的最后一個非空白單元格。
當菜單處于可見狀態時,按向左鍵或向右鍵可選擇左邊或右邊的菜單。當子菜單處于打開狀態時,按這些箭頭鍵可在主菜單和子菜單之間切換。
當菜單或子菜單處于打開狀態時,按向下鍵或向上鍵可選擇下一個或上一個命令。?在對話框中,按箭頭鍵可在打開的下拉列表中的各個選項之間移動,或在一組選項的各個選項之間移動。
按Alt+向下鍵可打開選定的下拉列表。?Backspace在編輯欄中刪除左邊的一個字符。?也可清除活動單元格的內容。
Delete從選定單元格中刪除單元格內容(數據和公式),而不會影響單元格格式或批注。?在單元格編輯模式下,按該鍵將會刪除插入點右邊的字符。?End當ScrollLock處于開啟狀態時,移動到窗口右下角的單元格。?當菜單或子菜單處于可見狀態時,也可選擇菜單上的最后一個命令。
按Ctrl+End可移動到工作表上的最后一個單元格,即所使用的最下方一行與所使用的最右邊一列的交匯單元格。
按Ctrl+Shift+End可將單元格的選定范圍擴展到工作表上所使用的最后一個單元格(右下角)。
Enter從單元格或編輯欄中完成單元格輸入,并(默認)選擇下面的單元格。?在數據表單中,按該鍵可移動到下一條記錄中的第一個字段。?打開選定的菜單(按F10激活菜單欄),或執行選定命令的操作。
在對話框中,按該鍵可執行對話框中默認命令按鈕(帶有突出輪廓的按鈕,通常為“確定”按鈕)的操作。
按Alt+Enter可在同一單元格中另起一個新行。
按Ctrl+Enter可使用當前條目填充選定的單元格區域。?按Shift+Enter可完成單元格輸入并選擇上面的單元格。?Esc取消單元格或編輯欄中的輸入。
按該鍵也可關閉打開的菜單或子菜單、對話框或消息窗口。?Home移到工作表中某一行的開頭。
當ScrollLock處于開啟狀態時,移到窗口左上角的單元格。?當菜單或子菜單處于可見狀態時,選擇菜單上的第一個命令。?按Ctrl+Home可移到工作表的開頭。
按Ctrl+Shift+Home可將單元格的選定范圍擴展到工作表的開頭。?PageDown在工作表中下移一個屏幕。
按Alt+PageDown可在工作表中向右移動一個屏幕。?按Ctrl+PageDown可移到工作簿中的下一個工作表。
按Ctrl+Shift+PageDown可選擇工作簿中的當前和下一個工作表。?PageUp在工作表中上移一個屏幕。
按Alt+PageUp可在工作表中向左移動一個屏幕。?按Ctrl+PageUp可移到工作簿中的上一個工作表。
按Ctrl+Shift+PageUp可選擇工作簿中的當前和上一個工作表。?空格鍵在對話框中,執行選定按鈕的操作,或者選中或清除復選框。?按Ctrl+空格鍵可選擇工作表中的整列。?按Shift+空格鍵可選擇工作表中的整行。?按Ctrl+Shift+空格鍵可選擇整個工作表。
如果工作表包含數據,則按Ctrl+Shift+空格鍵將選擇當前區域。再按一次Ctrl+Shift+空格鍵將選擇整個工作表。
當某個對象處于選定狀態時,按Ctrl+Shift+空格鍵可選擇工作表上的所有對象。?按Alt+空格鍵可顯示Excel窗口的“控制”菜單。?Tab在工作表中向右移動一個單元格。
在受保護的工作表中,可在未鎖定的單元格之間移動。?在對話框中,移到下一個選項或選項組。
按Shift+Tab可移到前一個單元格(在工作表中)或前一個選項(在對話框中)。?在對話框中,按Ctrl+Tab可切換到下一個選項卡。?在對話框中,按Ctrl+Shift+Tab可切換到前一個選項卡。
Excel表格Ctrl組合快捷鍵?按鍵說明?Ctrl+(取消隱藏選定范圍內所有隱藏的行。?Ctrl+)取消隱藏選定范圍內所有隱藏的列。?Ctrl+&將外框應用于選定單元格。?Ctrl+_從選定單元格刪除外框。?Ctrl+~應用“常規”數字格式。
在本教程中, 你將學習到以下內容:
注
下述解釋援引自理查德·斯澤利斯基(Richard Szeliski)的<<計算機視覺算法和應用>>一書。
兩種常用對比度調整的方法是將像素值乘以或加上一個常數:
(Java 版本請訪問:
https://github.com/opencv/opencv/blob/master/samples/java/tutorial_code/ImgProc/changing_contrast_brightness_image/BasicLinearTransformsDemo.java
Python 版本請訪問:
https://github.com/opencv/opencv/blob/master/samples/python/tutorial_code/imgProc/changing_contrast_brightness_image/BasicLinearTransforms.py)
使用CV :: imread加載圖像并將其保存到Mat對象中:
接下來,對該圖像做一些轉換,為此需要創建一個新的Mat對象來存放它。此外,我們希望它具備以下特征:
cv::Mat::zeros返回一個基于image.size()和image.type() 的Matlab格式的零初始化值。
注意(只適用于C ++代碼):
注我們利用以下簡單的命令來取代for循環來訪問圖像的每個像素:
cv::Mat::convertTo將執行*new_image=a*image + beta*操作.。但是,我們想向你展示如何訪問每個像素。在任何情況下,這兩種方法都給出相同的結果,但 convertTo 更加優化并且工作速度更快。
我們不運行代碼,設置α=2.2和β=50。
在本小節中,我們將以前學到的技巧付諸實戰,通過調整圖像的亮度和對比度來校正曝光不足的圖片。同時,學習利用伽瑪校正(gamma correction)技術來校正圖像的亮度。
增大(或減小) β值將加大(/減小)各個像素的對比度。像素值超出 [0; 255]范圍之外的值將會飽和(即:大于255,或小于0的像素值將鉗位到255或 0)。
原始圖像的淺灰色直方圖中,深灰色亮度=80 GIMP
直方圖表示該色彩像素中每種色彩的數目。深色圖像的像素值將大于淺色圖像的像素值,因此直方圖的左半部分會出現一個峰值。當添加一個恒定的偏差之后,整個直方圖右移,為所有的像素增加了一個恒定的偏置。
修改參數α將修改水平軸的展幅,如果α <1中,色彩值將被壓縮,其結果是圖像的對比度降低。
原圖像的淺灰色直方圖中,深灰色時, 對比度GIMP <0
注意,利用對比度/亮度工具Gimp獲得的上述柱狀圖,亮度工具的偏置參數β應該與之相同,但對比度工具的增益參數α是不同的(可以從前面的直方圖中看出)。
調整偏置參數β可以提高亮度,但同時,圖像的對比度會下降,圖像上似乎會蒙上一層輕微的面紗。調整增益α增益可緩釋這種效果,但是由于出現飽和,圖像將失去原有明亮區域的一些細節。
伽瑪校正利用輸入值和輸出映射值之間的非線性變換,校正圖像的亮度:
由于這種關系是非線性的,其效果不會影響所有的像素,最終輸出將取決于像素的原始值。
打印出不同的伽瑪值(gamma)
當γ <1時,,原始圖像的暗區將變得更加明亮,整個直方圖將右移;當γ > 1時, 原始圖像的亮區將變得更暗,整個直方圖將左移。
我們設置α=1.3和β=40修正下面的圖像。
圖: Visem的作品 [CC BY-SA 3.0],來源:維基共享資源
圖像的整體亮度得到了改善,但可以看出: 由于色彩的像素數值飽和,圖中云彩已經飽和(攝影高光修剪)。
我們用γ=0.4修正下面的圖像。
圖: Visem的作品 [CC BY-SA 3.0],來源:維基共享資源
由于映射是非線性的,伽馬校正添加了少量的飽和效應,并且不存在前面所述方法的數值飽問題。
左邊:α,β校正后的直方圖;中間:原始圖像的直方圖;右邊:伽馬校正后的直方圖
上圖比較了三幅圖像(三個直方圖的y值不相同)的直方圖。從中可以發現,大部分的像素值都在原始圖像直方圖的下部。α , β修正后,由于圖像出現飽和,在255 處可以觀察到一個峰值,整個直方圖右移。伽瑪校正后,直方圖右移,圖像暗區域中的像素移動的位移比在明亮區域像素移動的位移更大(見伽瑪曲線圖)。
在本教程中,描述了兩種調整圖像對比度和亮度簡單的方法。它們只是基本技術,不能用作光柵圖形編輯器的替代品!
教程的源代碼請訪問原文(地址在文末)
伽馬校正的源代碼Code:
在這里,由于一次只需要計算256 個數值,利用查找表來提高計算性能。
圖形渲染中的伽瑪校正
CRT監視器的伽瑪校正和圖像顯示
數字曝光技術
注:本文以C++語言代碼為例,獲取Java和python版本可在原文中查看:
https://docs.opencv.org/4.5.2/d3/dc1/tutorial_basic_linear_transform.html
*請認真填寫需求信息,我們會在24小時內與您取得聯系。