『壹』 軟體架構中,負載均衡有哪些調度演算法
謝邀!
負載均衡調度演算法也叫負載均衡方法有很多種,下面以使用比較廣的nginx為例說說軟體負載均衡的調度演算法:
nginx默認的調度演算法,按照時間順序逐一分配後台伺服器
在server後加weigth,weight值越高,後台伺服器分配概率越大,下圖是說ip為102的後台服務分配概率是ip為101後台服務的兩倍
按照訪問ip的hash分配,增加ip_hash關鍵字,同一ip訪問相同的後台服務
按照訪問url的hash分配,增加url_hash關鍵字,同一url訪問相同的後台服務
按照最少連接數方式分配,增加least_conn關鍵字,哪個後台服務連接數少就分配哪個
按照最短響應時間分配,增加fair關鍵字,響應時間短的後台服務優先分配
『貳』 怎麼實現伺服器的負載均衡
負載均衡有分硬體負載和軟體。
1.
硬體方面,可以用F5做負載,內置幾十種演算法。
2.
軟體方面,可以使用反向代理伺服器,例如apache,Nginx等高可用反向代理伺服器。
利用DNSPOD智能解析的功能,就可以實現多台機器負載均衡.
首先你用一台高配置的機器來當資料庫伺服器.然後把網站的前端頁面復製成多份,分別放在其他的幾台機器上面.再用DNSPOD做智能解析,把域名解析指向多個伺服器的IP,DNSPOD默認就有智能分流的作用,也就是說當有一台機器的資源不夠用時會自動引導用戶訪問其他機器上.這是相對來講比較簡單的實現負載均衡的方法.
『叄』 平衡二叉樹的各種演算法實現
多值結點平衡二叉樹的結構及演算法研究
1引言
傳統的AV1.樹是一種應用較為廣泛的數據結構,適合」幾組織在內存中的較小索引.它的
每個結l從上存儲有一個關鍵字、一個平衡因子和兩個指針項,山」幾它是一棵接近」幾理想狀態的
平衡二叉樹,所以AV1.樹具有很高的查詢效率.但正如任何事物都具有兩而性一樣,AV1.樹同
樣存在比較嚴重的缺l從,一是存儲效率比較低:真正有用的關鍵字在結l從上所,片的空間比例較
小,而作為輔助信息的平衡因子和指針卻,片據較大的空間;二是額外運算量比較大:當有結l從
被插入或刪除而導致AV1.樹不平衡時,AV1.樹就需要進行調整而保持它的平衡性,山」幾每個
結l從上只有一個關鍵字,所以任何一次的數據插入或刪除都有可能導致AV1.樹的平衡調整,
這種頻繁的調整運算將大大降低AV1.樹的存取效率.為解決以上問題,結合T3樹每個結l從可
以存儲多個關鍵字項的優l側}l,木文提出了多值結l從平衡二叉樹(簡稱MAV1.樹),它的主要特
點在」幾每個MAV1.樹的結l從都存儲有多個關鍵字項,而其它信息仍與AV1.樹一樣,即一個平
衡因子和兩個指針項.
2 MAV1.樹結構描述
MAV1.樹仍舊是一種平衡二叉樹,它的整體樹型結構和演算法也是建立在傳統的平衡二叉
樹基礎之上的.MAV1.樹的特徵在」幾它的每個結l從都可以存儲多個關鍵字(較理想的取值大約
在20} 50個之間).用C++語言描述的MAV1.樹結l從結構如卜:
struct NodeStruct
int IJ1emsOnNode;
int bf:
struct NodPStruct*lch;ld:
//一結點中項的數目
//平衡因子
//夕.子
struct NodeStruct * rchild:
}lemType }lemsi Max}lem} ;//結點中的項數組
Node T:
在這種結構中.ElemsOnNode反映的是「當前狀態卜」該結l從中關鍵字項的個數.當在此結
點插入一個關鍵字時.FlemsOnNode值加1.當刪除一個關鍵字時.則FlemsOnNode值減1.每個
結l從上可存儲的關鍵字個數介J幾1 } M axElem之間.bf為平衡因r.其作用等同J幾AV1.樹的平
衡因r. MAV1.樹的任一結l從的平衡因r只能取一1 ,0和1.如果一個結l從的平衡因r的絕對
值大」幾1.則這棵樹就失去了平衡.需要做平衡運算保持平衡.lehild和:child分別為指向左右
J"樹根結0的指針.Flems[ i]為結0中第i個關鍵字項.Flems} MaxFlem」是一個按升序排列的
關鍵字數組.具體的MAV1.樹結l從結構如圖1所示.
}lemsOnNode一h『一* leh;ld一
圖1
reh擊3
}lemsi 0}一
樹結點結構
}lemsi Max}lem}
MAVT
MAV1.樹的結構特l從使它比AV1.樹具有更高的存儲效率.在AV1.樹或MAV1.樹中.實際
有用的信急只有關鍵字.1f1! ElemsOnNode ,bf ,lehild和:child都是為了構建樹型結構If1J不得不添
加的輔助信急. MAV1.樹就是通過減小這些輔助信急的比例來獲得較高的存儲效率.山MAV1.
樹結l從的定義可以看出:FlemsOnNode和bf為int型.各,片4個位元組長度.指針型的lchild和
rchild也各,片4個位元組長度.在以上四項信急中.AV1.樹結l從除了沒有ElemsOnNode外.其餘和
MAV1.樹相同.現假設關鍵字長度為24位元組.M axFl二值定為50.則對AV1.樹來說.它的結l從
長度為36位元組.其中輔助信h,長度為12位元組;If}J MAV1.樹的結l從長度是1. 2K位元組.其中輔助
信急長度為16位元組.山此可以看出.MAV1.樹在存儲時.結l從中輔助信急長度,片整個結l從長度
的比例是很小的.它對存儲空間的利用效率比 AV1.樹要高.這一l從對」幾主要而向內存應用的
MAV1.樹來說是非常重要的.
在實際的應用中.當MAV1.樹作為資料庫索引結構時.為進一步節約內存空間.結l從中Fl-
emType的結構可根據實際需要作不同的定義.
( 1)當排序關鍵字較短時.可以直接將資料庫中的關鍵字值拷貝到索引文件中.這樣
MAV1.樹既有較快的運行速度又不會,片用太大的空間.此時ElemType定義如卜
struct IdxRlemStruct
{
int RecPos://金己錄號
KeyType Key://關鍵字
}R1emType;
( 2}當排序關鍵字較長時.如果直接將資料庫中的關鍵字值拷貝到索引文件中會,片據較大
的空間.此時可以採用只存儲關鍵字地址的形式.這樣不管關鍵字有多長.映射到MAV1.樹後
都只,片據一個指針的固定長度.這種以時間換空間的方法比較適合內存容量有限的情況.此時
ElemType定義如卜
struct Tdxl?lemStruct
int RecPos:
char * Key
R1emType;
//記錄號
//關鍵字指釗
3基於MAUI.樹的運算
MAUI.樹的基木運算.包括MAUI.樹的建立、記錄的插入、刪除、修改以及查詢.這些演算法
與基J幾AVI.樹的演算法相似.都建立在一叉查詢和平衡演算法基礎上.
3. 1 MAVI,樹的平衡運算
如果在一棵原木是平衡的MAUI.樹中插入一個新結l從.造成了不平衡.此時必須調整樹的
結構.使之平衡化「21 .MAUI.樹的平衡演算法與AVI.樹的平衡演算法是相同的.但山J幾MAUI.樹的
每個結l從中都存儲有多個關鍵字.所以在關鍵字個數相同的情況卜. MAUI.樹的應用可以大大
減少平衡運算的次數.例如.假設具有n個關鍵字的待插入序列在插入過程中有5%(根據隨
機序列特l從的不同.此數值會有所差異.這里以比較保守的5%為例)的新產生結l從會導致一
叉樹出現不平衡.對AVI.樹來說.山」幾需要為每個關鍵字分配一個結l從.所以在整個插入過程
中做平衡的次數為n * 5%;對J幾MAUI.樹.設MAUI.樹中M axFl二的值被定義為k(k為大J幾1
的正整數少,則平均每k次的數據插入才會有一個新結l從產生,所以在整個插入過程中需做平
衡的次數僅為(nlk) * 5%.即在M axFl二取值為k的情況卜.對」幾相同的待插入關鍵字序列.
在插入過程中MAUI.樹用J幾平衡運算的開銷是AVI.樹的1/ k.
3. 2數據查找
在MAUI.樹上進行查找.是一個從根結l從開始.沿某一個分支逐層向卜進行比較判等的過
程.假設要在MAUI.樹上查找的值為GetKey.查找過程從根結l從開始.如果根指針為NU1.1..則
查找失敗;否則把要查找的值GetKey與根結l從關鍵字數組中的最小項Elems [ 0]進行比較.如
果GetKev小」幾當前結i最小關鍵字.則遞歸查找左r樹;如果GetKey'大」幾Elems [ 0].則將
GetKey'與根結0關鍵字數組中的最大項Fletns} MaxFl二一1]進行比較.如果GetKey'大」幾當前
結l從最大關鍵字.則遞歸查找右r樹;否則.對當前結l從的關鍵字數組進行查找(山」幾是有序序
列.可以採用折半查找以提高效率).如果有與GetKey'相匹配的值.則查找成功.返回成功信
息,7{報告查找到的關鍵字地址.
3. 3數據插入
數據插入是構建MAV1.樹的基礎.設要在MAV1.樹*T上插入一個新的數據兀素GetKev,
其遞歸演算法描述如卜:
(1)若*T為空樹.則申清一新結} ' Elems} MaxElem}.將GetKey'插入到Flems[ 0]的位置.樹
的深度增1.
(2)若*T未滿.則在*T中找到插入位置後將GetKey'插入.JI在插入後保持結l從中的各
關鍵項有序遞增.若己存在與GetKev相同的項.則不進行插入.
(3)如果*T為滿結l從目一GetKey'值介」幾Flems[ 0]和Flems} MaxFlem]之間.則在*T中找到
GetKev的插入位置posit ion.山」幾*T木身就是滿結l從.所以GetKev的插入必然會將原來*T中
的某個數據擠出去JI卜降到r樹中.根據插入位置position的不同.分以卜幾種情況處理:若*
T中存在與C etl} e`'相同的項.則不進行插入;若插入位置在*T結ii的前半部分(即position <
=MaxFlem/ 2).則將Flems[ 1]到Fletns} position」的數據依次左移一位.再把GetKey插入到Elems
} MaxFlem」中position的位置.Ifn原來*T中最左邊項數據將被擠入到*T的左r樹中.考察此
數據的特l從.它必然大」幾*T左r樹中的任一數據項.所以此時不需要作任何的額外運算.直
接將此數據插入到*T左r樹根結i從的最右r孫位置處就可以了(見圖2中插入,}} 11"後「1,>
的位置變化);若插入位置在*T結ii的後半部分(即position> MaxFlem/ 2).則將Fletns} posi-
tion}到Fletns} MaxFl二一2}的數據依次右移一位.再把GetKev插入到*T結0中position的位
置.與前一種情況類似.結l從中最右邊被擠出的項將被插入到*T的右r樹根結l從的最左r孫
的位置(見圖2中插入「25"後" 30"的位置變化).
插入,"}i」插入」zs0
}o i is i }a
s}土 s
圖2
滿結點插入數據的過程
(4)若GetKey的值小」幾T的最小項值.則將GetKey遞歸插入到T的左r樹中.即在遞歸調
用時GetKey值不變Ifn T= T->lehild.
(5)若GetKey的值大」幾T的最大項值.則將GetKey遞歸插入到T的右r樹中.即在遞歸調
用時GetKey值不變Ifn T= T->rehild.
4結束語
山J幾MAV1.樹的結l從中存儲有多個關鍵字值.所以它具有較高的存儲效率;對MAV l樹進
行查找是_分查找和順序查找的結合.其查詢效率只略低」幾AV1.樹.血山」幾MAV1.樹的平衡
運算比AV1.樹要少得多.所以MAV1.樹有很優秀的綜合運算效率.綜上所述.在數據量大、內
存容量相對較小、數據增刪運算比較頻繁的情況卜.用MAV1.樹作為常駐內存的索引結構是一
種理想的選擇.
『肆』 常見的負載均衡技術
四層負責均衡:主要是指通過判斷報文的IP地址和埠並通過一定的負載均衡演算法來決定轉發到哪個指定目標,主要工作在OSI模型的第四層。四層負載均衡對數據包只是起一個數據轉發的作用,並不會干預客戶端與伺服器之間應用層的通信(如:三次握手等)。所以能對數據所進行的操作也就很少,但相對於七層負載均衡來講效率會高上很多
七層負載均衡:也被稱為「內容交換」,指的是負載均衡設備通過報文中的應用層信息(URL、HTTP頭部等信息)和負載均衡演算法,選擇到達目的的內部伺服器。七層負載均衡可以「智能化」地篩選報文中 應用層信息,然後根據不同的信息進行特定的負載均衡調度。這種方式提升了應用系統在網路層上的靈活性,另外也在一定程度上提升了後端系統的安全性。因為像網路常見的DoS攻擊,這些攻擊在七層負載均衡的環境下通常都在負載均衡設備上就截止了,不會影響到後台伺服器的正常運行。
前網路中常見的負載均衡主要分為硬體負載均衡和軟體負載均衡。硬體負載均衡比較知名的產品有F5 Big-IP、Cirtix Netscaler等等。而軟體負載均衡就有著眾多的開源項目,常見的有Haproxy、nginx、lvs等。
Haproxy:
lvs:
nginx:
Haproxy可以做代理服務相對於nginx而言有很多相同之處,統一可以基於mode tcp進行四層代理也可以基於mode http進行七層代理,但不同的是其無法使用location和if等進行匹配判斷。突出優勢在於有會話綁定,web管理界面,狀態統計非常詳細。官方推薦只啟用一個進程,相對於nginx多進程架構工作並不理想,更多的線程可能會受到系統內存的一些限制。
程序環境:
主程序:/usr/sbin/haproxy
主配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
查看配置文件
重要的幾個參數,及性能調優,多數無需修改
發現日誌發送給本機rsyslog的local2的facility,而本機的rsyslog里並沒有定義,需要我們自己去配置
所以vim /etc/rsyslog.conf添加一段將local2的所有信息記錄在對應日誌文件中
由於HAProxy可以工作在七層模型下,因此,要實現HAProxy的強大功能,一定要使用強大靈活的ACL規則,通過ACL規則可以實現基於HAProxy的智能負載均衡系統。HAProxy通過ACL規則完成兩種主要的功能,分別是:
1)通過設置的ACL規則檢查客戶端請求是否合法。如果符合ACL規則要求,那麼將放行;如果不符合規則,則直接中斷請求。
2)符合ACL規則要求的請求將被提交到後端的backend伺服器集群,進而實現基於ACL規則的負載均衡。HAProxy中的ACL規則經常使用在frontend段中,使用方法如下:
acl 自定義的acl 名稱 acl 方法 -i [ 匹配的路徑或文件] 其中:
·acl:是一個關鍵字,表示定義ACL規則的開始。後面需要跟上自定義的ACL名稱。
·acl方法:這個欄位用來定義實現ACL的方法,HAProxy定義了很多ACL方法,經常使用的方法有hdr_reg(host)、hdr_dom(host)、hdr_beg(host)、url_sub、url_dir、path_beg、path_end等。
·-i:表示不區分大小寫,後面需要跟上匹配的路徑或文件或正則表達式。與ACL規則一起使用的HAProxy參數還有use_backend,use_backend後面需要跟上一個backend實例名,表示在滿足ACL規則後去請求哪個backend實例,與use_backend對應的還有default_backend參數,它表示在沒有滿足ACL條件的時候默認使用哪個後端
這些例子定義了www_policy、bbs_policy、url_policy三個ACL規則,第一條規則表示如果客戶端以 www.z.cn 或 z.cn 開頭的域名發送請求時,則此規則返回true,同理第二條規則表示如果客戶端通過 bbs.z.cn 域名發送請求時,則此規則返回true,而第三條規則表示如果客戶端在請求的URL中包含「buy_sid=」字元串時,則此規則返回true。
第四、第五、第六條規則定義了當www_policy、bbs_policy、url_policy三個ACL規則返回true時要調度到哪個後端backend,例如,當用戶的請求滿足www_policy規則時,那麼HAProxy會將用戶的請求直接發往名為server_www的後端backend,其他以此類推。而當用戶的請求不滿足任何一個ACL規則時,HAProxy就會把請求發往由default_backend選項指定的server_cache這個後端backend。
與上面的例子類似,本例中也定義了url_static、host_www和host_static三個ACL規則,其中,第一條規則通過path_end參數定義了如果客戶端在請求的URL中以.gif、.png、.jpg、.css或.js結尾時返回true,第二條規則通過hdr_beg(host)參數定義了如果客戶端以www開頭的域名發送請求時則返回true,同理,第三條規則也是通過hdr_beg(host)參數定義了如果客戶端以img.、video.、download.或ftp.開頭的域名發送請求時則返回true。
第四、第五條規則定義了當滿足ACL規則後要調度到哪個後端backend,例如,當用戶的請求同時滿足host_static規則與url_static規則,或同時滿足host_www和url_static規則時,那麼會將用戶請求直接發往名為static的後端backend,如果用戶請求滿足host_www規則,那麼請求將被調度到名為www的後端backend,如果不滿足所有規則,那麼將用戶請求默認調度到名為server_cache的這個後端backend。
log:全局的日誌配置,local0是日誌設備,info表示日誌級別。其中日誌級別有err、warning、info、debug4種可選。這個配置表示使用127.0.0.1上的rsyslog服務中的local0日誌設備,記錄日誌等級為info。
maxconn:設定每個HAProxy進程可接受的最大並發連接數,此選項等同於Linux命令行選項「ulimit -n」。
user/group:設置運行HAProxy進程的用戶和組,也可使用用戶和組的uid和gid值來替代。
daemon:設置HAProxy進程進入後台運行。這是推薦的運行模式。
nbproc:設置HAProxy啟動時可創建的進程數,此參數要求將HAProxy運行模式設置為daemon,默認只啟動一個進程。該值的設置應該小於伺服器的CPU核數。創建多個進程,能夠減少每個進程的任務隊列,但是過多的進程可能會導致進程崩潰。
pidfile:指定HAProxy進程的pid文件。啟動進程的用戶必須有訪問此文件的許可權。
mode:設置HAProxy實例默認的運行模式,有tcp、http、health三個可選值。
retries:設置連接後端伺服器的失敗重試次數,如果連接失敗的次數超過這里設置的值,HAProxy會將對應的後端伺服器標記為不可用。此參數也可在後面部分進行設置。
timeout connect:設置成功連接到一台伺服器的最長等待時間,默認單位是毫秒,但也可以使用其他的時間單位後綴。
timeout client:設置連接客戶端發送數據時最長等待時間,默認單位是毫秒,也可以使用其他的時間單位後綴。
timeout server:設置伺服器端回應客戶端數據發送的最長等待時間,默認單位是毫秒,也可以使用其他的時間單位後綴。
timeout check:設置對後端伺服器的檢測超時時間,默認單位是毫秒,也可以使用其他的時間單位後綴。
bind:此選項只能在frontend和listen部分進行定義,用於定義一個或幾個監聽的套接字。bind的使用格式為: bind [<address>:<port_range>] interface <interface>其可以為主機名或IP地址,如果將其設置為「*」或「0.0.0.0」,將監聽當前系統的所有IPv4地址。port_range可以是一個特定的TCP埠,也可是一個埠范圍,小於1024的埠需要有特定許可權的用戶才能使用。interface為可選選項,用來指定網路介面的名稱,只能在Linux系統上使用。
option httplog:在默認情況下,HAProxy日誌是不記錄HTTP請求的,這樣很不方便HAProxy問題的排查與監控。通過此選項可以啟用日誌記錄HTTP請求。
option forwardfor:如果後端伺服器需要獲得客戶端的真實IP,就需要配置此參數。由於HAProxy工作於反向代理模式,因此發往後端真實伺服器的請求中的客戶端IP均為HAProxy主機的IP,而非真正訪問客戶端的地址,這就導致真實伺服器端無法記錄客戶端真正請求來源的IP,而X-Forwarded-For則可用於解決此問題。通過使用forwardfor選項,HAProxy就可以向每個發往後端真實伺服器的請求添加X-Forwarded-For記錄,這樣後端真實伺服器日誌可以通過「X-Forwarded-For」信息來記錄客戶端來源IP。
option httpclose:此選項表示在客戶端和伺服器端完成一次連接請求後,HAProxy將主動關閉此TCP連接。這是對性能非常有幫助的一個參數。
log global:表示使用全局的日誌配置,這里的global表示引用在HAProxy配置文件global部分中定義的log選項配置格式。
default_backend:指定默認的後端伺服器池,也就是指定一組後端真實伺服器,而這些真實伺服器組將在backend段進行定義。這里的htmpool就是一個後端伺服器組。
option redispatch:此參數用於cookie保持的環境中。在默認情況下,HAProxy會將其請求的後端伺服器的serverID插入cookie中,以保證會話的session持久性。而如果後端的伺服器出現故障,客戶端的cookie是不會刷新的,這就會出現問題。此時,如果設置此參數,就會將客戶的請求強制定向到另外一台健康的後端伺服器上,以保證服務正常。
option abortonclose:如果設置了此參數,可以在伺服器負載很高的情況下,自動結束當前隊列中處理時間比較長的連接。
-balance:此關鍵字用來定義負載均衡演算法。目前HAProxy支持多種負載均衡演算法,常用的有如下幾種:
cookie:表示允許向cookie插入SERVERID,每台伺服器的SERVERID可在下面的server關鍵字中使用cookie關鍵字定義。
option httpchk:此選項表示啟用HTTP的服務狀態檢測功能。HAProxy作為一個專業的負載均衡器,它支持對backend部分指定的後端服務節點的健康檢查,以保證在後端backend中某個節點不能服務時,把從frotend端進來的客戶端請求分配至backend中其他健康節點上,從而保證整體服務的可用性。
option httpchk的用法如下: option httpchk <method> <uri> <version> 其中,各個參數的含義如下:
check:表示啟用對此後端伺服器執行健康狀態檢查。
inter:設置健康狀態檢查的時間間隔,單位為毫秒。
rise:設置從故障狀態轉換至正常狀態需要成功檢查的次數,例如,「rise 2」表示2次檢查正確就認為此伺服器可用。
fall:設置後端伺服器從正常狀態轉換為不可用狀態需要檢查的次數,例如,「fall 3」表示3次檢查失敗就認為此伺服器不可用。
cookie:為指定的後端伺服器設定cookie值,此處指定的值將在請求入站時被檢查,第一次為此值挑選的後端伺服器將在後續的請求中一直被選中,其目的在於實現持久連接的功能。上面的「cookie server1」表示web1的serverid為server1。同理,「cookie server2」表示web2的serverid為server2。
weight:設置後端真實伺服器的權重,默認為1,最大值為256。設置為0表示不參與負載均衡。
backup:設置後端真實伺服器的備份伺服器,僅僅在後端所有真實伺服器均不可用的情況下才啟用。
用nginx反代後端的兩台tomcat主機,做動靜分離,如果是jsp結尾的就發往後端,否則就交給nginx處理。
在兩台tomcat主機上創建應用
nginx配置
則動靜分離就實現了,並且我們還基於uri實現了會話粘性
『伍』 直方圖均衡化對有些圖片不能達到好的效果, 為什麼
我來說一下
首先直方圖均衡化的公式為sk對nj/n在j由0到k求和,正如樓主你所說,它所起到的作用是把原本分布不均的灰度直方圖在整個灰度級別內均勻分布。
呵呵,一定要抓住這一點,即均衡化是由公式實現的,你想一想,對於一幅很暗的圖片,既是它的灰度直方圖全都集中在低灰度區,即比如灰度值由0-255,灰度值是2,3,5等的低灰度的頻數就會很大,即它們的頻率好高,因為這幅畫很暗。好,現在咱們把這幅畫均衡化,看那個公式的定義,根據公式得來的數據,即均衡化後的直方圖中,低灰度區,比如5這一灰度級所對應的頻數是不是很大,因為現在的是把原圖中低灰度區,即正如上面所假設的2,3,5這些頻率很大的灰度級相加而得,當然加後所得更大,即在均衡化後,僅5這一點得頻數就已經很高,即頻數很大,即灰度級很大,可想而知,越往後加,灰度級都很大,對應的,灰度級大了,當然直方圖就集中在高灰度區,相應的圖像就發白或很亮。特別亮的也是一個道理。
對於這種情況,應該用直方圖規定化(匹配)來處理。
對於馬賽克,很簡單,你想想,先畫一個8*8格,拿不同深度的鉛筆,比如H,2H,B,2B之類的,你想在只拿一種深度的把四個格都塗滿,是不是黑乎乎一片,然後拿兩種筆塗,是不是有了區別。你用的鉛筆深度種類越多,整個格所構成的圖畫細節越明顯。同理,當你把很暗的圖均衡化後,灰度級別都集中在高灰度區,就相當於筆的種類很少來畫這幅畫,當然也有馬賽克。
給你截的圖是均衡化後的,你仔細想想.
呵呵