Beruflich Dokumente
Kultur Dokumente
Image Compression
ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮ
ﭘﻴﺶ ﻧﻤﺎﻳﺶ)(preview
در ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮ ﻣﻘﺪار دادهﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﻤﺎﻳﺶ ﺗﺼﻮﻳﺮ دﻳﺠﻴﺘﺎﻟﻲ ﻛﺎﻫﺶ ﻣﻲﻳﺎﺑﺪ .ﺑﺮاي اﻧﺠﺎم اﻳﻦ ﻛﺎر ﻳﻚ ﻳﺎ ﭼﻨﺪ ﻋﺎﻣﻞ از
) (1اﻓﺰوﻧﮕﻲ ﻛﺪﻫﺎ) (Coding redundancyزﻣﺎﻧﻲ اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﻛﻪ از ﺣﺪاﻗﻞ ﻛﺪﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻃﻮل ﺗﺼﻮﻳﺮ ﺑﻬﺮهﺑﺮداري ﺷﻮد.
) (2اﻓﺰوﻧﮕﻲ ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي) :(Interpixel redundancyﻛﻪ ﻧﺘﻴﺠﻪ راﺑﻄﻪ ﻣﺘﻘﺎﺑﻞ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي اﺳﺖ
) (3اﻓﺰوﻧﮕﻲ رواﻧﻲ – ﺗﺠﺴﻤﻲ) :(Psychovisual redundancyﻛﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ دادهﻫﺎﻳﻲ ﻛﻪ در ﭼﺸﻢ اﻧﺴﺎن ﺑﻪ ﺣﺴﺎب ﻧﻤﻲآﻳﻨﺪ اﻧﺠﺎم
ﻣﻲﺷﻮد )ﻳﻌﻨﻲ اﻃﻼﻋﺎﺗﻲ ﻛﻪ از ﻧﻈﺮ دﻳﺪاري ﺿﺮوري ﻧﻴﺴﺖ( .در اﻳﻦ ﻓﺼﻞ ﻫﺮ ﻳﻚ از اﻳﻦ اﻓﺰوﻧﮕﻲﻫﺎ را ﺑﺮرﺳﻲ ﻛﺮده و ﺷﮕﺮدﻫﺎي ﺑﻬﺮهﺑﺮداري از
آﻧﻬﺎ را ﺷﺮح ﻣﻲدﻫﻴﻢ و 2اﺳﺘﺎﻧﺪارد ﻓﺸﺮدهﺳﺎزي ﺑﺎ ﭘﺴﻮﻧﺪ jpeg, jpeg2000را ﺷﺮح ﻣﻲدﻫﻴﻢ .ﻣﻔﺎﻫﻴﻢ اراﺋﻪ ﺷﺪه در اﻳﻨﺠﺎ در اﻳﻦ
اﺳﺘﺎﻧﺪاردﻫﺎ ﻳﻜﻲ ﻣﻲﺷﻮﻧﺪ و اﻳﻦ ﺷﮕﺮدﻫﺎ ﺑﺎ دادهﻫﺎي 3ﻧﻮع اﻓﺰوﻧﮕﻲ ﻓﻮق ﻛﺎر ﻣﻲﻛﻨﻨﺪ.
از آﻧﺠﺎﺋﻲ ﻛﻪ ﺟﻌﺒﻪ اﺑﺰار ﭘﺮدازش ﺗﺼﻮﻳﺮ ﺗﺎﺑﻌﻬﺎﻳﻲ ﺑﺮاي ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮ ﻧﺪارد ،ﻧﻜﺘﻪ اﺻﻠﻲ در اﻳﻦ ﻓﺼﻞ روﺷﻬﺎي ﻛﺎرﺑﺮدي ﺷﮕﺮدﻫﺎي
ﻓﺸﺮدهﺳﺎزي در ﻧﺮم اﻓﺰار MATLABاﺳﺖ .ﻣﺜﻼً ﻳﻚ ﺗﺎﺑﻊ Cﻓﺮاﺧﻮانﭘﺬﻳﺮ اﻳﺠﺎد ﻣﻲﻛﻨﻴﻢ ﻛﻪ ﻧﺤﻮه ﻣﺪﻳﺮﻳﺖ دادهﻫﺎﻳﻲ ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ را در
ﺳﻄﺢ ﺑﻴﺖ ﻧﺸﺎن ﻣﻲدﻫﺪ .اﻫﻤﻴﺖ اﻳﻦ ﻧﻜﺘﻪ از آن ﺟﻬﺖ اﺳﺖ ﻛﻪ رﻣﺰﮔﺬاري ﻃﻮل ﻣﺘﻐﻴﺮ ﻧﻜﺘﻪ اﺻﻠﻲ ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮ اﺳﺖ وﻟﻲ ﻧﺮم
اﻓﺰار MATLABﺑﺮاي ﭘﺮدازش ﻣﺎﺗﺮﻳﺴﻬﺎﻳﻲ ﺣﺎوي دادهﻫﺎﻳﻲ ﺑﺎ ﻃﻮل ﺛﺎﺑﺖ ﻣﻄﻠﻮب اﺳﺖ .ﺣﻴﻦ اﺑﺪاع اﻳﻦ ﺗﺎﺑﻊ ﻓﺮض ﺷﺪه اﺳﺖ ﻛﻪ ﺧﻮاﻧﻨﺪﮔﺎن
از زﺑﺎن Cاﻃﻼع دارﻧﺪ و ﻧﻜﺘﻪ اﺻﻠﻲ اﻳﻦ ﻣﺒﺤﺚ ﻛﻨﺶ و واﻛﻨﺶ ﻧﺮم اﻓﺰار MATLABﺑﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي Cو Fortranاﺳﺖ ﻛﻪ ﺧﺎرج از اﻳﻦ
ﻧﺮم اﻓﺰار اﺟﺮا ﻣﻲﺷﻮﻧﺪ .اﻫﻤﻴﺖ اﻳﻦ ﻧﻜﺘﻪ در زﻣﺎﻧﻲ اﺳﺖ ﻛﻪ ﺑﺨﻮاﻫﻴﻢ از ﺗﺎﺑﻊﻫﺎي Mدر ﺑﺮﻧﺎﻣﻪﻫﺎي Fortranو Cاﺳﺘﻔﺎده ﻛﻨﻴﻢ و ﻧﻴﺎز ﺑﻪ
اﻓﺰاﻳﺶ ﺷﺘﺎب ﺗﺎﺑﻌﻬﺎي Mﺑﺮدارﺑﻨﺪي ﺷﺪه ﺑﺎﺷﺪ) .ﻣﺜﻼً وﻗﺘﻲ ﻧﺘﻮان ﻳﻚ ﺣﻠﻘﻪ forرا ﺑﻪ ﻗﺪر ﻛﺎﻓﻲ ﺑﺮدارﺑﻨﺪي ﻛﺮد( .ﺗﺎﺑﻌﻬﺎي اﺑﺪاع ﺷﺪه در
اﻳﻦ ﻓﺼﻞ و ﺗﻮاﻧﺎﻳﻲ ﻧﺮم اﻓﺰار MATLABﺑﺮاي ﻛﺎر ﺑﺎ ﺑﺮﻧﺎﻣﻪﻫﺎي Cو Fortranﻃﻮري ﻛﻪ ﺗﺎﺑﻌﻬﺎي ﻓﻮق ﺑﻪ ﺻﻮرت ﻣﺘﻌﺎرف و ﺗﻌﺒﻴﻪ ﺷﺪه
ﺑﻪ ﻛﺎر ﺑﺮده ﺷﻮﻧﺪ ﺣﺎﻛﻲ از آن اﺳﺖ ﻛﻪ ﻧﺮم اﻓﺰار MATLABاﺑﺰاري ﻛﺎرآﻣﺪ ﺑﺮاي اﻳﺠﺎد ﻧﻤﻮﻧﻪﻫﺎي اﺻﻠﻲ اﻟﮕﻮرﻳﺘﻤﻬﺎ و ﺳﻴﺴﺘﻢﻫﺎي
ﻓﺸﺮدهﺳﺎزي اﺳﺖ.
1
.6.1ﺗﺎرﻳﺨﭽﻪ)(Background
ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﺗﺼﻮﻳﺮ 6.1دﻳﺪه ﻣﻲﺷﻮد ،ﺳﻴﺴﺘﻢﻫﺎي ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮ از 2ﺑﻠﻮك ﻣﺘﻤﺎﻳﺰ رﻣﺰﮔﺬار) (Encoderو رﻣﺰﮔﺸﺎ)(Decoder
ﺗﺸﻜﻴﻞ ﺷﺪهاﻧﺪ .ﺗﺼﻮﻳﺮ ) f(x, yﺑﻪ رﻣﺰﮔﺬار ﺧﻮراﻧﺪه ﻣﻲﺷﻮد و ﻣﺠﻤﻮﻋﻪاي از ﻧﻤﺎدﻫﺎ از دادهﻫﺎي ورودي اﻳﺠﺎد ﻣﻲﺷﻮد ﻛﻪ از آﻧﻬﺎ ﺑﺮاي ﻧﻤﺎﻳﺶ
ﺗﺼﻮﻳﺮ اﺳﺘﻔﺎده ﻣﻲﺷﻮد .اﮔﺮ n1, n2ﺑﻪ ﺗﺮﺗﻴﺐ ﺗﻌﺪاد واﺣﺪﻫﺎي ﺣﺎﻣﻞ اﻃﻼﻋﺎت )ﺑﺮ ﺣﺴﺐ ﺑﻴﺖ( در ﺗﺼﻮﻳﺮﻫﺎي اﺻﻠﻲ و رﻣﺰﮔﺬاري ﺷﺪه ﺑﺎﺷﻨﺪ،
n1
= CR
n2
وﻗﺘﻲ ﻧﺴﺒﺖ ﻓﺸﺮدهﺳﺎزي ) (10:1ﺑﺎﺷﺪ ،ﻳﻌﻨﻲ ﺗﺼﻮﻳﺮ اﺻﻠﻲ در ﻫﺮ واﺣﺪ در دادهﻫﺎي ﻓﺸﺮده ﺷﺪه 10واﺣﺪ ﺣﺎﻣﻞ اﻃﻼﻋﺎت دارد .در ﻧﺮم اﻓﺰار
MATLABﻧﺴﺒﺖ ﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﻣﻮرد اﺳﺘﻔﺎده ﺑﺮاي ﻧﻤﺎﻳﺶ 2ﭘﺮوﻧﺪه ﺗﺼﻮﻳﺮي و ﻣﺘﻐﻴﺮﻫﺎي ﻣﺮﺑﻮﻃﻪ ﺑﺎ ﺗﺎﺑﻌﻬﺎي Mزﻳﺮ ﻣﺤﺎﺳﺒﻪ ﻣﻲﺷﻮد.
)function cr = imratio(f1, f2
%IMRATIO Computes the ratio of the bytes in two images/variables.
% CR = IMRATIO(F1, F2) returns the ratio of the number of bytes in
% variables/ files F1 and F2. If F1 and F2 are an original and
% compressed image, respectively, CR is the compression ratio.
%-------------------------------------------------------------------------------%
)function b = bytes(f
% Return the number of bytes in input f. If f is a string, assume
% that it is an image filename; if not, it is an image variable.
)if ischar(f
2
;)info = dir(f ;b = info.bytes
)elseif isstruct(f
% MATLAB's whos function reports an extra 124 bytes of memory
% per structure field because of the way MATLAB stores
% structures in memory. Don’t count this extra memory; instead,
% add up the memory associated with each field.
;b = 0
;)fields = fieldnames(f
)for k = 1:length(fields
;))}b = b + bytes(f.(fields{k
end
else
;)'info = whos('f ;b = info.bytes
end
ﻣﺜﻼً ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮي ﻛﻪ ﺑﺎ ﻣﺤﺘﻮاي jpegرﻣﺰﮔﺬاري ﺷﺪه اﺳﺖ در ﻋﻜﺲ .2.4ﺳﻲ ﻓﺼﻞ 2از ﻃﺮﻳﻖ ﻓﺮﻣﻮﻟﻬﺎي زﻳﺮ ﻗﺎﺑﻞ ﻣﺤﺎﺳﺒﻪ اﺳﺖ:
)'>> r = imratio(imread('bubbles25.jpg'), 'bubbles25.jpg
= r
35.1612
ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ imratioﺗﺎﺑﻊ داﺧﻠﻲ ) b=bytes(fاﺳﺖ ﻛﻪ ﺑﺮاي ﺗﻮﻟﻴﺪ ﺗﻌﺪاد ﺑﺎﻳﺘﻬﺎ در ﺳﻪ ﻣﻮرد زﻳﺮ ﺑﻪ ﻛﺎر ﻣﻲرود:
) (3ﻣﺘﻐﻴﺮ ﻏﻴﺮﺳﺎﺧﺘﺎري .a nonstructure variable a structure variable ) (1ﭘﺮوﻧﺪه (2) a fileﻣﺘﻐﻴﺮﻫﺎي ﺳﺎﺧﺘﺎري
اﮔﺮ fﻣﺘﻐﻴﺮ ﻏﻴﺮﺳﺎﺧﺘﺎري ﺑﺎﺷﺪ ،ﺗﺎﺑﻊ whosﻛﻪ ﺑﺮاي ﺳﻨﺠﺶ اﻧﺪازه آن ﺑﺮ ﺣﺴﺐ ﺑﺎﻳﺖ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد .اﮔﺮ fاﺳﻢ ﻳﻚ ﭘﺮوﻧﺪه ﺑﺎﺷﺪ ،ﺗﺎﺑﻊ
dirﻛﺎر ﻣﺸﺎﺑﻬﻲ اﻧﺠﺎم ﻣﻲدﻫﺪ .در ﺗﺮﻛﻴﺐ اﺳﺘﻔﺎده ﺷﺪه dirﻳﻚ ﺳﺎﺧﺘﺎر ﺗﻮﻟﻴﺪ ﻣﻲﻛﻨﺪ ﻛﻪ field’s name, date, bytes, isdirدر آن
ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ .آﻧﻬﺎ ﺑﻪ ﺗﺮﺗﻴﺐ ﻧﺎم ﭘﺮوﻧﺪه ،ﺗﺎرﻳﺦ اﺟﺮاي ﺗﻐﻴﻴﺮات ،اﻧﺪازه آن ﺑﺮ ﺣﺴﺐ ﺑﺎﻳﺖ ،و ﻣﺴﻴﺮ ﺑﻮدن آن را ﻣﺸﺨﺺ ﻣﻲﻛﻨﻨﺪ )اﮔﺮ
1، isdirﺑﺎﺷﺪ ﻣﺴﻴﺮ اﺳﺖ و اﮔﺮ 0ﺑﺎﺷﺪ ﻣﺴﻴﺮ ﻧﻴﺴﺖ( اﮔﺮ fﻳﻚ ﺳﺎﺧﺘﺎر ﺑﺎﺷﺪ bytes ،ﻣﻜﺮراٌ ﺧﻮد را ﻓﺮاﻣﻲﺧﻮاﻧﺪ ﺗﺎ ﺗﻌﺪاد ﺑﺎﻳﺘﻬﺎي ﺗﺨﺼﻴﺺ
داده ﺷﺪه ﺑﻪ ﻫﺮ ﻣﻴﺪان ﺳﺎﺧﺘﺎر ﺟﻤﻊ ﺑﺴﺘﻪ ﺷﻮد .ﺑﻨﺎ ﺑﺮ اﻳﻦ ﺑﺎﻻﺳﺮي ﻣﺘﻐﻴﺮ ﺳﺎﺧﺘﺎري ) 124ﺑﻴﺖ در ﻫﺮ ﻣﻴﺪان( ﺣﺬف ﻣﻲﺷﻮد و ﻓﻘﻂ ﺗﻌﺪاد
ﺑﺎﻳﺘﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي دادهﻫﺎي ﻣﻴﺪان ﺗﻮﻟﻴﺪ ﻣﻲﺷﻮد .ﺗﺎﺑﻊ fieldnameﺑﺮاي ﺑﻪ دﺳﺖ آوردن ﻓﻬﺮﺳﺖ ﻣﻴﺪاﻧﻬﺎ در fاﺳﺖ و ﻋﺒﺎرﺗﻬﺎي زﻳﺮ
)for k = 1:length(fields
;))}b = b + bytes(f.(fields{k
ﺑﺮاي اﺟﺮاي ﺗﻜﺮارﻫﺎ ﻫﺴﺘﻨﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در ﻓﺮاﺧﻮاﻧﻲ ﻣﻜﺮر ﺑﺎﻳﺘﻬﺎ از اﺳﺎﻣﻲ ﻣﻴﺪاﻧﻬﺎ ﺑﺎ ﺳﺎﺧﺘﺎر ﭘﻮﻳﺎ اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ .اﮔﺮ sﺳﺎﺧﺘﺎر و f
ﺑﺮاي ﺗﻌﻴﻴﻦ ﻳﺎ اﺧﺬ ﻣﺤﺘﻮﻳﺎت ﺳﺎﺧﺘﺎر fاز ﺗﺮﻛﻴﺐ ﻧﺎم ﻣﻴﺪان و ﺳﺎﺧﺘﺎر ﭘﻮﻳﺎ اﺳﺘﻔﺎده ﻣﻲﺷﻮد.
ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﺎ اﺳﺘﻔﺎده از ﻳﻚ ﺗﺼﻮﻳﺮ رﻣﺰﮔﺬاري ﺷﺪه ﻓﺸﺮده اﺑﺘﺪا ﺑﺎﻳﺪ آن را ﺑﻪ رﻣﺰﮔﺸﺎ )ﺗﺼﻮﻳﺮ (6.1داد ﺗﺎ ﺗﺼﻮﻳﺮ ﺧﺮوﺟﻲ ) f(x, yﺑﺎزﺳﺎزي
ﺷﻮد .ﻣﻤﻜﻦ اﺳﺖ ) f’(x, yﻧﻤﺎد دﻗﻴﻘﻲ از ) f(x, yﺑﺎﺷﺪ ﻳﺎ ﻧﺒﺎﺷﺪ .اﮔﺮ ﺑﺎﺷﺪ ﺳﻴﺴﺘﻢ را ﻋﺎري ازﺧﻄﺎ)،(error freeﻣﺤﺎﻓﻆ اﻃﻼﻋﺎت
3
در ﺣﺎﻟﺖ. اﮔﺮ ﻧﺒﺎﺷﺪ ﻳﻌﻨﻲ ﺗﺼﻮﻳﺮ ﺑﺎزﺳﺎزي ﺷﺪه ﺗﺤﺮﻳﻒ ﺷﺪه اﺳﺖ.( ﻣﻲﻧﺎﻣﻴﻢlossless)( ﻳﺎ ﺑﺪون ﺧﺴﺎرتinformation preserving)
ﺑﺮاي ﻫﺮf’(x, y) وf(x, y) را ﺑﻴﻦe(x, y) ﻣﻲﺗﻮان ﺧﻄﺎي،( ﻣﻲﻧﺎﻣﻴﻢlossy compression) دوم ﻛﻪ آن را ﻓﺸﺮدهﺳﺎزي اﺗﻼف ﺷﺪه
e( x , y ) = f̂ ( x , y ) − f ( x , y )
:ﻃﻮري ﻛﻪ ﻣﺠﻤﻮع ﺧﻄﺎﻫﺎي ﺑﻴﻦ دو ﺗﺼﻮﻳﺮ ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ
ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖm*n اﺳﺖ ﻛﻪ ﻣﻴﺎﻧﮕﻴﻦ آن در اراﻳﻪ2 رﻳﺸﻪ دوم ﺧﻄﺎ ﺑﻪ ﺗﻮانf’(x, y) وf(x, y) و ﺟﺬر ﻣﻴﺎﻧﮕﻴﻦ ﻣﺮﺑﻌﺎت ﺑﻴﻦ
?
.
e(x, y) از آﻧﺠﺎﺋﻲ ﻛﻪ. و ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎي آن را ﻧﺸﺎن ﻣﻲدﻫﺪe(x, y) ﻏﻴﺮ از ﺻﻔﺮ ﺑﺎﺷﺪerms را ﻣﺤﺎﺳﺒﻪ ﻛﺮده و اﮔﺮerms زﻳﺮM ﺗﺎﺑﻊ
hist )ﻛﻪ ﻓﻘﻂ ﺑﺎ دادهﻫﺎي ﺗﺼﻮﻳﺮي ﻛﺎر ﻣﻲﻛﻨﺪ( ازimhist ﺑﺮاي ﺗﻮﻟﻴﺪ ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎ ﺑﻪ ﺟﺎي،ﻣﻲﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ﻣﺜﺒﺖ ﻳﺎ ﻣﻨﻔﻲ داﺷﺘﻪ ﺑﺎﺷﺪ
.اﺳﺘﻔﺎده ﻣﻲﺷﻮد
function rmse = compare(f1, f2, scale)
%COMPARE Computes and displays the error between two matrices.
% RMSE = COMPARE(F1, F2, SCALE) returns the root-mean-square error
% between inputs F1 and F2, displays a histogram of the difference,
% and displays a scaled difference image. When SCALE is omitted, a
% scale factor of 1 is used.
4
رﻣﺰﮔﺬار ﺗﺼﻮﻳﺮ 6.1ﻣﺴﺌﻮل ﻛﺎﻫﺶ اﻓﺰوﻧﮕﻲ رﻣﺰﮔﺬاري ،ﺑﻴﻦ ﭘﻴﻜﺴﻠﻲ و رواﻧﻲ-دﻳﺪاري ﺗﺼﻮﻳﺮ ورودي اﺳﺖ .ﻧﻘﺸﻪﺑﺮدار در اوﻟﻴﻦ ﻣﺮﺣﻠﻪ ﻓﺮاﻳﻨﺪ
رﻣﺰﮔﺬاري ﺗﺼﻮﻳﺮ ورودي را ﺑﻪ ﻗﺎﻟﺒﻲ ﻏﻴﺮﺗﺼﻮﻳﺮي ﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﺪ ﻛﻪ ﺑﺮاي ﻛﺎﻫﺶ اﻓﺰوﻧﮕﻲ ﻋﻨﺎﺻﺮ ﺑﻴﻦ ﺗﺼﻮﻳﺮي ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ .در ﻣﺮﺣﻠﻪ
دوم ﻳﻚ ﺑﻠﻮك ﻣﺒﺪل دﻗﺖ دادهﻫﺎي ﺧﺮوﺟﻲ اﺑﺰار ﻧﻘﺸﻪﺑﺮدار را ﻣﻄﺎﺑﻖ ﺑﺎ ﻣﻌﻴﺎرﻫﺎي وﻓﺎداري از ﭘﻴﺶ ﺗﻌﻴﻴﻦ ﺷﺪه ﻛﺎﻫﺶ ﻣﻲدﻫﺪ ﺗﺎ دادهﻫﺎﻳﻲ
ﻛﻪ از ﻧﻈﺮ رواﻧﻲ – دﻳﺪاري اﺿﺎﻓﻪ ﻫﺴﺘﻨﺪ ﺣﺬف ﺷﻮﻧﺪ .اﻳﻦ ﻋﻤﻠﻴﺎت ﺑﺮﮔﺸﺖﻧﺎﭘﺬﻳﺮ اﺳﺖ و اﮔﺮ ﻓﺸﺮدهﺳﺎزي ﺑﺪون ﺧﻄﺎ ﻣﻮرد ﻧﻈﺮ ﺑﺎﺷﺪ ﺑﺎﻳﺪ
ﺣﺬف ﺷﻮد .در ﻣﺮﺣﻠﻪ ﺳﻮم و ﻧﻬﺎﻳﻲ اﻳﻦ ﻓﺮاﻳﻨﺪ ﻳﻚ رﻣﺰﮔﺬار ﻧﻤﺎدﻳﻦ رﻣﺰي اﻳﺠﺎد ﻣﻲﻛﻨﺪ ﻛﻪ اﻓﺰوﻧﮕﻲ رﻣﺰﮔﺬاري را در ﻣﺒﺪل دادهﻫﺎي ﺧﺮوﺟﻲ
رﻣﺰﮔﺸﺎي ﺗﺼﻮﻳﺮ ، 6.1دو ﻣﻮﻟﻔﻪ دارد :رﻣﺰﮔﺸﺎي ﻧﻤﺎدﻳﻦ ) (symbol decoderو ﻧﻘﺸﻪ ﺑﺮدار ﻣﻌﻜﻮس ) .(inverse mapperاﻳﻦ ﻗﻄﻌﻪﻫﺎ
ﻣﻌﻜﻮس اﺟﺮا ﻣﻲﺷﻮﻧﺪ ،ﻋﻤﻠﻴﺎت ﻣﻌﻜﻮس رﻣﺰﮔﺬار ﻧﻤﺎدﻳﻦ و ﻧﻘﺸﻪ ﺑﺮدار ﺟﻠﻮي ﻳﻜﺪﻳﮕﺮ را ﻣﻲﮔﻴﺮﻧﺪ زﻳﺮا ﺗﺒﺪﻳﻞ ﺑﺮﮔﺸﺖﻧﺎﭘﺬﻳﺮ اﺳﺖ و ﺑﻠﻮك
) (l_gray_levelﺑﺎﺷﺪ R1 .ﻫﻤﭽﻮن ﻓﺼﻞ 3ﻣﻄﺎﺑﻖ ﺑﺎ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي 0اﺳﺖ)زﻳﺮا اراﻳﻪﻫﺎي MATLABﻧﻤﻲﺗﻮاﻧﻨﺪ ﺻﻔﺮ ﺑﺎﺷﻨﺪ(
nk
= ) pr (rk k = 1,2,..., L
n
در اﻳﻨﺠﺎ nkﺗﻌﺪاد دﻓﻌﺎﺗﻲ اﺳﺖ ﻛﻪ kاﻣﻴﻦ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي در ﺗﺼﻮﻳﺮ ﻇﺎﻫﺮ ﻣﻲﺷﻮد و nﺗﻌﺪاد ﻛﻞ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي ﻣﻮﺟﻮد در ﻋﻜﺲ اﺳﺖ.
اﮔﺮ ﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﻘﺪار rkﻣﻌﺎدل ) l(rkﺑﺎﺷﺪ ﻣﻴﺎﻧﮕﻴﻦ ﺑﻴﺘﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﻤﺎﻳﺶ ﻫﺮ ﻋﻨﺼﺮ ﺗﺼﻮﻳﺮي ﺑﻪ ﺷﺮح زﻳﺮ
اﺳﺖ:
L
) Lavg = ∑ l (rk ) pr (rk
k =1
ﻳﻌﻨﻲ ﻣﻴﺎﻧﮕﻴﻦ ﻃﻮل ﻛﻠﻤﺎت رﻣﺰي ﺗﺨﺼﻴﺺ داده ﺷﺪه ﻣﻘﺎدﻳﺮ ﮔﻮﻧﺎﮔﻮن ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي ﺑﺎ ﺟﻤﻊ ﻣﺠﻤﻮع ﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﻣﻮرد اﺳﺘﻔﺎده ﺑﺮاي
ﻧﻤﺎﻳﺶ ﻫﺮ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي و اﺣﺘﻤﺎل وﻗﻮع ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي ﻣﺸﺨﺺ ﻣﻲﺷﻮد .ﺑﻨﺎ ﺑﺮ اﻳﻦ ﻛﻞ ﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي رﻣﺰﮔﺬاري
وﻗﺘﻲ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﻳﻚ ﺗﺼﻮﻳﺮ ﺑﺎ اﺳﺘﻔﺎده از رﻣﺰ دودوﻳﻲ mﺑﻴﺖ ﻃﺒﻴﻌﻲ ﻧﻤﺎﻳﺶ داده ﻣﻲﺷﻮﻧﺪ ،ﺳﻤﻦ راﺳﺖ ﻣﻌﺎدﻟﻪ ﻗﺒﻞ ﺑﻪ mﺑﻴﺖ
ﻛﺎﻫﺶ ﻣﻲﻳﺎﺑﺪ.
5
ﺟﺪول :6.1ﻳﻚ ﻣﺜﺎل از اﻓﺰوﻧﮕﻲ رﻣﺰﮔﺬاري
ﻳﻌﻨﻲ وﻗﺘﻲ mﺟﺎﻳﮕﺰﻳﻦ ) l(rkﺷﻮد lavg=mﻣﻲﺷﻮد .ﺳﭙﺲ mﺛﺎﺑﺖ ﺧﺎرج از ﻣﺠﻤﻮع ﺑﺮده ﻣﻲﺷﻮد و ﻓﻘﻂ ﻣﺠﻤﻮع ) pr(rkﺑﺮاي 1<k<l
ﺑﺎﻗﻲ ﻣﻲﻣﺎﻧﺪ .ﻛﻪ ﻣﺴﺎوي 1اﺳﺖ .ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﺟﺪول 6.1دﻳﺪه ﻣﻲﺷﻮد ،وﻗﺘﻲ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﻳﻚ ﺗﺼﻮﻳﺮ ﺑﺎ اﺳﺘﻔﺎده از ﻛﺪ دودوﻳﻲ
ﻃﺒﻴﻌﻲ رﻣﺰﮔﺬاري ﻣﻲﺷﻮﻧﺪ اﻓﺰوﻧﮕﻲ رﻣﺰﮔﺬاري ﻫﻤﻴﺸﻪ وﺟﻮد دارد .در اﻳﻦ ﺟﺪول رﻣﺰﮔﺬاري ﻃﻮل ﺛﺎﺑﺖ و ﻣﺘﻐﻴﺮ ﺗﺼﻮﻳﺮ 4ﺳﻄﺤﻲ دﻳﺪه
ﻣﻲﺷﻮد ﻛﻪ ﺗﻮزﻳﻊ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي آن در ﺳﺘﻮن 2ﻧﺸﺎن داده ﺷﺪه اﺳﺖ .ﻣﻴﺎﻧﮕﻴﻦ ﻃﻮل رﻣﺰﮔﺬاري دودوﻳﻲ 2ﺑﻴﺘﻲ در ﺳﺘﻮن 3دو ﺑﻴﺖ
اﺳﺖ .ﻣﻴﺎﻧﮕﻴﻦ ﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﻣﻮرد ﻧﻴﺎز در رﻣﺰﮔﺬاري 2در ﺳﺘﻮن 5ﺑﺎ راﺑﻄﻪ زﻳﺮ ﺣﺎﺻﻞ ﻣﻲﺷﻮد و
?
ﻧﺴﺒﺖ ﻓﺸﺮدهﺳﺎزي ﺣﺎﺻﻞ از آن cr=2/1825=1103اﺳﺖ .ﻣﺒﻨﺎي ﻓﺸﺮدهﺳﺎزي رﻣﺰ 2آن اﺳﺖ ﻛﻪ ﻛﻠﻤﺎت آن ﻃﻮل ﻣﺘﻐﻴﺮ دارﻧﺪ .ﺑﻨﺎ ﺑﺮ اﻳﻦ
ﻛﻮﺗﺎﻫﺘﺮﻳﻦ ﻛﻠﻤﺎت ﺑﻪ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮﻧﺪ ﻛﻪ ﺑﻪ ﺗﻌﺪاد دﻓﻌﺎت ﺑﻴﺸﺘﺮي در ﺗﺼﻮﻳﺮ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﻨﺪ.
ﺳﻮال آن اﺳﺖ ﻛﻪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺗﺼﻮﻳﺮ ﭼﻨﺪ ﺑﻴﺖ واﻗﻌﺎً ﻣﻮرد ﻧﻴﺎز اﺳﺖ؟ ﺣﺪاﻗﻞ ﺗﻌﺪاد داده ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﻤﺎﻳﺶ ﺗﺼﻮﻳﺮ
ﺑﺪون از دﺳﺖ دادن اﻃﻼﻋﺎت ﭼﻘﺪر اﺳﺖ؟ ﺑﺮاي ﭘﺎﺳﺦ دادن ﺑﻪ اﻳﻦ ﻣﻮﺿﻮع و ﭘﺮﺳﺸﻬﺎي ﻣﺮﺗﺒﻂ ﺑﻪ ﻓﺮﺿﻴﻪ اﻃﻼﻋﺎت ﻣﺮاﺟﻌﻪ ﻣﻲﻛﻨﻴﻢ .اﺻﻞ
ﺣﺎﻛﻢ ﺑﺮ آن اﻳﻦ اﺳﺖ ﻛﻪ اﻟﮕﻮي ﺗﻮﻟﻴﺪ اﻃﻼﻋﺎت ﺑﺮ اﺳﺎس ﻓﺮاﻳﻨﺪ اﺣﺘﻤﺎﻻت اﺳﺖ و ﺑﻪ ﺷﻜﻠﻲ ﻣﻄﺎﺑﻖ ﺑﺎ ﺣﺲ ﺷﺸﻢ ﺳﻨﺠﻴﺪه ﻣﻲﺷﻮد .ﻃﺒﻖ اﻳﻦ
ﻓﺮﺿﻴﻪ ﺗﻌﺪاد واﺣﺪﻫﺎي اﻃﻼﻋﺎﺗﻲ روﻳﺪاد ﺗﺼﺎدﻓﻲ Eﺑﺎ اﺣﺘﻤﺎل ) P(Eﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ:
?
اﮔﺮ P(E)=1ﺑﺎﺷﺪ ﻳﻌﻨﻲ اﻳﻦ روﻳﺪاد ﻫﻤﻮاره اﺗﻔﺎق اﻓﺘﺪ I(E)=0 ،ﻣﻲﺷﻮد و ﻫﻴﭻ اﻃﻼﻋﺎﺗﻲ ﺑﻪ آن ﻣﺮﺗﺒﻂ ﻧﻴﺴﺖ .از آﻧﺠﺎﺋﻲ ﻛﻪ ﻫﻴﭻ ﻧﻮع
اﺑﻬﺎﻣﻲ ﺑﺎ اﻳﻦ روﻳﺪاد ارﺗﺒﺎط ﻧﺪارد ،وﻗﻮع اﻳﻦ روﻳﺪاد ﺑﺎﻋﺚ اﻧﺘﻘﺎل ﻫﻴﭻ اﻃﻼﻋﺎﺗﻲ ﻧﻤﻲﺷﻮد .ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻦ روﻳﺪادﻫﺎي ﺗﺼﺎدﻓﻲ و ﻣﺠﻤﻮﻋﻪ وﻗﺎﻳﻊ
6
اﺣﺘﻤﺎﻟﻲ ] [a1,a2,…,ajﺑﺎ اﺣﺘﻤﺎﻻت }) {p(a1),p(a2),..p(ajﻣﻴﺎﻧﮕﻴﻦ اﻃﻼﻋﺎت ﻣﻨﺒﻊ ﺧﺮوﺟﻲ ﻛﻪ درﺟﻪ ﺑﻲﻧﻈﻤﻲ ﻣﻨﺒﻊ ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد ﺑﻪ
?
اﮔﺮ ﺗﺼﻮﻳﺮي ﺑﻪ ﻋﻨﻮان ﻧﻤﻮﻧﻪاي از ﻣﻨﺒﻊ ﺧﺎﻛﺴﺘﺮي ﺳﺎﻃﻊ ﻛﻨﻨﺪه آن ﺗﻌﺒﻴﺮ ﺷﻮد ،ﻣﻲﺗﻮان ﺑﺮاي اﻟﮕﻮﺑﺮداري اﺣﺘﻤﺎﻻت ﻧﻤﺎد آن ﻣﻨﺒﻊ از ﭘﻴﺸﻴﻨﻪ
ﻧﻤﺎي) (histogramﺧﺎﻛﺴﺘﺮي ﺗﺼﻮﻳﺮ ﻣﺸﺎﻫﺪه ﺷﺪه اﺳﺘﻔﺎده ﻛﺮد و ﺑﺮآورد درﺟﻪ ﻳﻚ درﺟﻪ ﺑﻲﻧﻈﻤﻲ ﻣﻨﺒﻊ را ﺗﺨﻤﻴﻦ زد.
?
ﺑﻪ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ findدر ﻧﺮم اﻓﺰار MATLABﺗﻮﺟﻪ ﻛﻨﻴﺪ ،ﻛﻪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﺷﺎﺧﺼﻬﺎي ﻋﻨﺎﺻﺮ ﻏﻴﺮﺻﻔﺮ ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎي xhﺑﻪ ﻛﺎر ﺑﺮده
ﺷﺪه اﺳﺖ .ﻋﺒﺎرت ) find (xﻣﻌﺎدل ﻋﺒﺎرت ) find (x~=0اﺳﺖ .ﺗﺎﺑﻊ درﺟﻪ ﺑﻲﻧﻈﻤﻲ ﺑﺮاي اﻳﺠﺎد ﺑﺮدار ﺷﺎﺧﺼﻬﺎي Iدر ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎي xhاز
findاﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ ﻛﻪ ﺑﺮاي ﺣﺬف ﻛﻠﻴﻪ ﻋﻨﺎﺻﺮ ﺑﺎ ﻣﻘﺪار ﺻﻔﺮ از ﻣﺤﺎﺳﺒﻪ درﺟﻪ ﺑﻲﻧﻈﻤﻲ در ﻋﺒﺎرت ﻧﻬﺎﻳﻲ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮﻧﺪ .اﮔﺮ اﻳﻦ ﻛﺎر
اﻧﺠﺎم ﻧﺸﻮد ،ﺗﺎﺑﻊ log2دادهﻫﺎي ﺧﺮوﺟﻲ hرا ﺑﻪ زور ﺑﻪ Nanﻣﻲدﻫﺪ ) 0*-infﻳﻚ ﻋﺪد ﻧﻴﺴﺖ(در ﺣﺎﻟﺘﻲ ﻛﻪ ﻧﻤﺎد اﺣﺘﻤﺎﻻت ﺻﻔﺮ ﺑﺎﺷﺪ.
ﻳﻚ ﺗﺼﻮﻳﺮ ﺳﺎده 4*4را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻛﻪ ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎي آن ) pدر ﻛﺪ ﺑﻌﺪي( اﺣﺘﻤﺎﻻت ﻧﻤﺎد را در ﺟﺪول 6.1اﻟﮕﻮﺑﺮداري ﻛﻨﺪ .ﺗﺮﺗﻴﺐ
ﻋﺒﺎرﺗﻬﺎ در ﺧﻂ ﻓﺮﻣﺎن زﻳﺮ ﭼﻨﻴﻦ ﺗﺼﻮﻳﺮي را اﻳﺠﺎد ﻣﻲﻛﻨﺪ و ﺷﺎﺧﺺ درﺟﻪ ﺑﻲﻧﻈﻤﻲ آن را ﻣﺤﺎﺳﺒﻪ و ارزﻳﺎﺑﻲ ﻣﻲﻛﻨﺪ.
7
;]>> f = [119 123 168 119; 123 119 168 168
];>> f = [f; 119 119 107 119; 107 107 119 119
= f
119 123 168 119
123 119 168 168
119 119 107 119
107 107 119 119
;)p = hist(f(:), 8
)p = p / sum(p
= p
0.1875 0.5 0.125 0 0 0 0 0.1875
)h = entropy(f
= h
1.7806
رﻣﺰ 2ﺟﺪول 6.1ﺑﺎ lavg=1.81ﻧﺰدﻳﻚ ﺑﻪ ﺑﺮآورد ﺷﺎﺧﺺ درﺟﻪ ﺑﻲﻧﻈﻤﻲ اﺳﺖ و ﻛﺪ دودوﻳﻲ ﺣﺪاﻗﻞ ﻃﻮل ﺗﺼﻮﻳﺮ fاﺳﺖ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ
ﻛﻪ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي 107ﻣﻄﺎﺑﻖ ﺑﺎ r1و ﻛﻠﻤﺎت رﻣﺰي دودوﻳﻲ ( 011 )2ﻣﻄﺎﺑﻖ ﺑﺎ ﺟﺪول 6.1و 119ﻣﻄﺎﺑﻖ ﺑﺎ r2و ﻛﺪﻫﺎي 123 ،(1)2و
ﻫﻨﮕﺎم رﻣﺰﮔﺬاري ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي) (gray levelsﻳﻚ ﺗﺼﻮﻳﺮ و ﻳﺎ دادهﻫﺎي ﺧﺮوﺟﻲ ﻋﻤﻠﻴﺎت ﻧﻘﺸﻪ ﺑﺮداري ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي )اﺧﺘﻼف
ﭘﻴﻜﺴﻠﻬﺎ ،ﻃﻮل و ﻏﻴﺮه( ﻛﺪﻫﺎي ﻫﺎﻓﻤﻦ ﻛﻤﺘﺮﻳﻦ ﺗﻌﺪاد ﻧﻤﺎدﻫﺎي رﻣﺰي )ﻣﺜﻞ ﺑﻴﺖ( را در ﻫﺮ ﻧﻤﺎد ﻣﻨﺒﻊ )ﻣﺜﻼً ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي( دارﻧﺪ و
اوﻟﻴﻦ ﮔﺎم در روش ﻫﺎﻓﻤﻦ اﻳﺠﺎد واﺣﺪﻫﺎي ﻛﺎﻫﺶ ﻣﻨﺒﻊ ﺑﺎ ﻣﺮﺗﺐ ﻛﺮدن اﺣﺘﻤﺎﻻت ﻧﻤﺎدﻫﺎي ﻣﻮرد ﻧﻈﺮ و ادﻏﺎم ﻧﻤﺎدﻫﺎي ﻛﻢ اﺣﺘﻤﺎل ﺑﺎ ﻧﻤﺎدﻫﺎي
ﺗﻜﻲ اﺳﺖ ﻛﻪ در ﻣﺮﺣﻠﻪ ﻛﺎﻫﺶ ﺑﻌﺪي ﺟﺎﻳﮕﺰﻳﻦ آﻧﻬﺎ ﻣﻲﺷﻮﻧﺪ .درﺗﺼﻮﻳﺮ( a).6.2اﻳﻦ ﻓﺮاﻳﻨﺪ ﺑﺮاي ﺗﻮزﻳﻊ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي در ﺟﺪول 6.1ﻧﺸﺎن
داده ﺷﺪه اﺳﺖ .در ﺳﻤﺖ ﭼﭗ ﻣﺠﻤﻮﻋﻪ ﻣﻘﺪﻣﺎﺗﻲ ﻧﻤﺎدﻫﺎي ﻣﻨﺒﻊ و اﺣﺘﻤﺎﻻت آﻧﻬﺎ از ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ ﺑﺮ ﺣﺴﺐ ﻣﻘﺎدﻳﺮ اﺣﺘﻤﺎﻻت ﻣﺮﺗﺐ ﺷﺪهاﻧﺪ.
ﺑﺮاي ﻛﺎﻫﺶ اوﻟﻴﻦ ﻣﻨﺒﻊ دو اﺣﺘﻤﺎل آﺧﺮ ﻳﻌﻨﻲ 0.125و 0.1875ﺑﺎ ﻫﻢ ادﻏﺎم ﻣﻲﺷﻮﻧﺪ ﺗﺎ ﻳﻚ ﻧﻤﺎد ﺗﺮﻛﻴﺒﻲ ﺑﺎ اﺣﺘﻤﺎل 0.3125اﻳﺠﺎد ﺷﻮد.
اﻳﻦ ﻧﻤﺎد ﺗﺮﻛﻴﺒﻲ و اﺣﺘﻤﺎل ﻣﺮﺗﺒﻂ ﺑﺎ آن در اوﻟﻴﻦ ﺳﺘﻮن ﻛﺎﻫﺶ ﻣﻨﺒﻊ ﻗﺮار داده ﻣﻲﺷﻮﻧﺪ ﻃﻮري ﻛﻪ اﺣﺘﻤﺎﻻت ﻣﻨﺒﻊ ﻛﺎﻫﺶ ﻳﺎﻓﺘﻪ از ﺣﺪاﻛﺜﺮ ﺗﺎ
ﺣﺪاﻗﻞ اﺣﺘﻤﺎﻻت ﻣﺮﺗﺐ ﻣﻲﺷﻮﻧﺪ .اﻳﻦ ﻓﺮاﻳﻨﺪ آﻧﻘﺪر ﺗﻜﺮار ﻣﻲﺷﻮد ﺗﺎ ﻣﻨﺒﻊ ﻛﺎﻫﺶ ﻳﺎﻓﺘﻪ ﺑﺎ 2ﻧﻤﺎد در ﻣﻨﺘﻬﺎ اﻟﻴﻪ ﺳﻤﺖ راﺳﺖ ﺗﺸﻜﻴﻞ ﺷﻮد.
ﮔﺎم دوم در روش ﻫﺎﻓﻤﻦ رﻣﺰﮔﺬاري ﻫﺮ ﻣﻨﺒﻊ ﻛﺎﻫﺶ ﻳﺎﻓﺘﻪ ﺑﺎ ﻛﻮﭼﻜﺘﺮﻳﻦ ﻣﻨﺒﻊ و ﻛﺎر ﺑﺎ ﻣﻨﺒﻊ اﺻﻠﻲ اﺳﺖ .رﻣﺰﻫﺎي دودوﻳﻲ ﺑﺎ ﺣﺪاﻗﻞ ﻃﻮل در
ﻣﻨﺒﻊﻫﺎي دو ﻧﻤﺎدي از ﻧﻤﺎدﻫﺎي 0و 1ﺗﺸﻜﻴﻞ ﻣﻲﺷﻮﻧﺪ .ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﺗﺼﻮﻳﺮ .6.2ب ﻣﻲﺑﻴﻨﻴﺪ ،اﻳﻦ ﻧﻤﺎدﻫﺎ ﺑﻪ دو ﻧﻤﺎد ﺳﻤﺖ راﺳﺖ
ﺗﺨﺼﻴﺺ داده ﺷﺪهاﻧﺪ )اﻳﻦ ﺗﺨﺼﻴﺺ اﺧﺘﻴﺎري اﺳﺖ ﺑﺎ ﻣﻌﻜﻮسﺳﺎزي ﺗﺮﺗﻴﺐ 0و 1ﻧﻴﺰ ﻛﺎر ﺑﻪ ﻫﻤﻴﻦ ﺷﻜﻞ اﺟﺮا ﻣﻲﺷﻮد( .وﻗﺘﻲ ﻧﻤﺎد ﻛﺎﻫﺶ
8
ﻳﺎﻓﺘﻪ ﻣﻨﺒﻊ ﺑﺎ اﺣﺘﻤﺎل 0.5ﺑﺎ ادﻏﺎم دو ﻧﻤﺎد در ﻣﻨﺒﻊ ﻛﺎﻫﺶ ﻳﺎﻓﺘﻪ ﺳﻤﺖ ﭼﭗ ﺗﻮﻟﻴﺪ ﻣﻲﺷﻮد ﺻﻔﺮي ﻛﻪ ﺑﺮاي رﻣﺰﮔﺬاري آن ﺑﻪ ﻛﺎر ﺑﺮده ﺷﺪه
اﺳﺖ ﺑﻪ ﻫﺮ دو ﻧﻤﺎد ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮد و 0و 1ﻫﺮ ﻛﺪام اﺧﺘﻴﺎري ﺑﻪ ﻫﺮ ﻛﺪام از آﻧﻬﺎ ﻣﺘﺼﻞ ﻣﻲﺷﻮﻧﺪ ﺗﺎ ﺑﺘﻮان آﻧﻬﺎ را از ﻳﻜﺪﻳﮕﺮ ﺗﺸﺨﻴﺺ
داد.
اﻳﻦ ﻋﻤﻠﻴﺎت در ﻫﺮ ﻳﻚ از ﻣﻨﺎﺑﻊ ﻛﺎﻫﺶ ﻳﺎﻓﺘﻪ آﻧﻘﺪر ﺗﻜﺮار ﻣﻲﺷﻮد ﻛﻪ ﺑﻪ ﻣﻨﺒﻊ اﺻﻠﻲ دﺳﺖ ﻳﺎﺑﻨﺪ .رﻣﺰ ﻧﻬﺎﻳﻲ در ﻣﻨﺘﻬﺎ اﻟﻴﻪ ﺳﻤﺖ ﭼﭗ ﺳﺘﻮن 3
رﻣﺰ ﻫﺎﻓﻤﻦ در ﺗﺼﻮﻳﺮ .6.2ب و ﺟﺪول 6.1ﻳﻚ رﻣﺰ ﻓﻮري ﻣﻨﺤﺼﺮ ﺑﻪ ﻓﺮد ﻗﺎﺑﻞ رﻣﺰﮔﺸﺎﻳﻲ اﺳﺖ .اﻳﻦ ﻳﻚ رﻣﺰ ﺑﻠﻮﻛﻲ اﺳﺖ زﻳﺮا ﻫﺮ ﻧﻤﺎد ﻣﻨﺒﻊ ﺑﻪ
ﺗﻮاﻟﻴﻬﺎي ﺛﺎﺑﺘﻲ از ﻧﻤﺎدﻫﺎي رﻣﺰ ﺗﺮﺳﻴﻢ ﻣﻲﺷﻮد .از آن ﺟﻬﺖ ﻓﻮري اﺳﺖ ﻛﻪ ﻫﺮ ﻛﻠﻤﻪ رﻣﺰي در رﺷﺘﻪ ﻧﻤﺎدﻫﺎي رﻣﺰ ﻣﻲﺗﻮاﻧﺪ ﺑﺪون ﻣﺮﺟﻊﮔﺬاري
ﻧﻤﺎدﻫﺎي ﺑﻌﺪي رﻣﺰﮔﺸﺎﻳﻲ ﺷﻮد .ﻳﻌﻨﻲ ﻛﻠﻤﺎت ﺑﺪون رﻣﺰ در ﻫﺮ ﻳﻚ از رﻣﺰﻫﺎي ﻫﺎﻓﻤﻦ ﺑﻪ ﺻﻮرت ﻳﻚ در ﻣﻴﺎن ﭘﻴﺸﻮﻧﺪ ﻛﻠﻤﺎت ﻫﺴﺘﻨﺪ .آﻧﻬﺎ ﺑﻪ
ﺷﻜﻠﻲ ﻣﻨﺤﺼﺮ ﺑﻪ ﻓﺮد ﻗﺎﺑﻞ رﻣﺰﮔﺸﺎﻳﻲ ﻫﺴﺘﻨﺪ زﻳﺮا رﺷﺘﻪ ﻧﻤﺎدﻫﺎ را ﻓﻘﻂ در ﻳﻚ ﺟﻬﺖ ﻣﻲﺗﻮان رﻣﺰﮔﺸﺎﻳﻲ ﻛﺮد .ﺑﻨﺎ ﺑﺮ اﻳﻦ ﺑﺮاي رﻣﺰﮔﺸﺎﻳﻲ ﻫﺮ
ﻳﻚ از ﻧﻤﺎدﻫﺎي رﻣﺰﮔﺬاري ﺷﺪه ﻫﺎﻓﻤﻦ ﻋﻨﺎﺻﺮ ﺗﺸﻜﻴﻞ ﺷﺪه در رﺷﺘﻪ از ﭼﭗ ﺑﻪ راﺳﺖ ﺑﺮرﺳﻲ ﻣﻲﺷﻮﻧﺪ .در ﺗﺼﻮﻳﺮ 4*4در ﻣﺜﺎل 6.1ﻳﻚ
رﻣﺰﮔﺬاري ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ و ﭼﭗ ﺑﻪ راﺳﺖ ﺑﺮ اﺳﺎس رﻣﺰ ﻫﺎﻓﻤﻦ در ﺗﺼﻮﻳﺮ .6.2ب رﺷﺘﻪ 29ﺑﻴﺘﻲ زﻳﺮ را ﺗﻮﻟﻴﺪ ﻣﻲﻛﻨﺪ .101010111111 :از
9
آﻧﺠﺎﺋﻲ ﻛﻪ از ﻳﻚ ﺑﻠﻮك رﻣﺰ ﻣﻨﺤﺼﺮ ﺑﻪ ﻓﺮد ﻓﻮري ﻗﺎﺑﻞ رﻣﺰﮔﺸﺎﻳﻲ اﺳﺘﻔﺎده ﻣﻲﻛﻨﻴﻢ ﻧﻴﺎزي ﺑﻪ درج ﺟﺪاﺳﺎز ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي رﻣﺰﮔﺬاري
119 ﻳﺎ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮيa2 اﺳﺖ ﻛﻪ رﻣﺰ ﻧﻤﺎد1 در ﺑﺮرﺳﻲ رﺷﺘﻪ ﺣﺎﺻﻞ از آن از ﭼﭗ ﺑﻪ راﺳﺖ ﻣﻌﻠﻮم ﺷﺪ ﻛﻪ اوﻟﻴﻦ رﻣﺰ ﻣﻌﺘﺒﺮ.ﺷﺪه ﻧﻴﺴﺖ
اﮔﺮ ﻛﺎر را ﺑﻪ ﻫﻤﻴﻦ ﻣﻨﻮال اداﻣﻪ دﻫﻴﻢ ﺑﺎﻻﺧﺮه ﺑﻪ ﻳﻚ. اﺳﺖ123 اﺳﺖ ﻛﻪ ﻣﻄﺎﺑﻖ ﺑﺎ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي010 ﻛﻠﻤﻪ رﻣﺰي ﻣﻌﺘﺒﺮ ﺑﻌﺪي.اﺳﺖ
. اﺟﺮا ﺷﺪﻧﺪ ﻫﺎﻓﻤﻦ ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮﻧﺪM روﺷﻬﺎي ﻛﺎﻫﺶ ﻣﻨﺒﻊ و ﺗﺨﺼﻴﺺ رﻣﺰﻫﺎ ﻛﻪ در ﺑﺎﻻ ﺑﺎ ﺗﺎﺑﻊ
function CODE = huffman(p)
%HUFFMAN Builds a variable-length Huffman code for a symbol source.
% CODE = HUFFMAN(P) returns a Huffman code as binary strings in
% cell array CODE for input symbol probability vector P. Each word
% in CODE corresponds to a symbol whose probability is at the
% corresponding index of P.
%
% Based on huffman5 by Sean Danaher, University of North Umbria,
% Newcastle UK. Available at the MATLAB Central File Exchange:
% Category General DSP in Signal Processing and Communications.
10
;}}s{2} = {s{1}, s{2 % and merge & prune its nodes
;][ = )s(1 % to match the probabilities
end
%----------------------------------------------------------------------------------
----%
)function makecode(sc, codeword
% Scan the nodes of a Huffman source reduction tree recursively to
% generate the indicated variable length code words.
% Global variable surviving all recursive calls
global CODE
)'if isa(sc, 'cell % For cell array nodes,
;)]makecode(sc{1}, [codeword 0 % add a 0 if the 1st element
;)]makecode(sc{2}, [codeword 1 % or a 1 if the 2nd
else % For leaf (numeric) nodes,
;)CODE{sc} = char('0' + codeword % create a char code string
end
در ﺧﻂ ﻓﺮﻣﺎن زﻳﺮ ﺑﺮاي ﺗﻮﻟﻴﺪ رﻣﺰ در ﺗﺼﻮﻳﺮ 6.2از ﻫﺎﻓﻤﻦ اﺳﺘﻔﺎده ﻣﻲﺷﻮد.
>> p = [0.1875 0.5 0.125 ;]0.1875
)>> c = Huffman(p
=c o
''011
''1
''010
''00
ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ داده ﺧﺮوﺟﻲ آراﻳﻪاي ﻧﻮﻳﺴﻪدار ﺑﺎ ﻃﻮل ﺗﻐﻴﻴﺮﭘﺬﻳﺮ اﺳﺖ ﻛﻪ ﻫﺮ ردﻳﻒ آن ﻳﻚ رﺷﺘﻪ از ﺻﻔﺮﻫﺎ و ﻳﻜﻬﺎ اﺳﺖ ﻛﻪ رﻣﺰ
دودوﻳﻲ ﻧﻤﺎد ﺷﺎﺧﺺ ﮔﺬاري ﺷﺪه ﻣﻄﺎﺑﻖ ﺑﺎ آن در ﭘﻲ اﺳﺖ .ﻣﺜﻼً 010در اراﻳﻪ ﺷﺎﺧﺺ 3رﻣﺰ ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي ﺑﺎ اﺣﺘﻤﺎل 0.125اﺳﺖ.
ﺷﻨﺎﺳﻪ ورودي pدر ﻗﺴﻤﺘﻬﺎي اول ﻫﺎﻓﻤﻦ )ﺑﺮدار اﺣﺘﻤﺎﻻت ﻧﻤﺎد ورودي ﻧﻤﺎدﻫﺎي رﻣﺰﮔﺬاري ﺷﺪه( از ﻧﻈﺮ ﻣﻌﻘﻮل ﺑﻮدن ﺑﺮرﺳﻲ ﻣﻲﺷﻮد و رﻣﺰ
ﺗﻐﻴﻴﺮﭘﺬﻳﺮ ﻛﻠﻲ ﺑﻪ ﺻﻮرت اراﻳﻪ ﺳﻠﻮﻟﻬﺎي MATLABﺑﺎ lengthﺑﻪ اﻧﺪازه pردﻳﻒ و ﻳﻚ ﺳﺘﻮن ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ ﺷﺮوع ﻣﻲﺷﻮد .ﻛﻠﻴﻪ
ﻣﺘﻐﻴﺮﻫﺎي ﻛﻠﻲ ﻧﺮم اﻓﺰار MATLABﺑﺎﻳﺪ ﺑﺮ ﺣﺴﺐ ﺗﺎﺑﻌﻬﺎﻳﻲ ﺑﻴﺎن ﺷﻮﻧﺪ ﻛﻪ ﺑﺎ ﻋﺒﺎرﺗﻬﺎﻳﻲ ﺷﺒﻴﻪ ﺑﻪ ﻋﺒﺎرت زﻳﺮ ﻣﺮﺟﻊ ﮔﺬاري ﻣﻲﺷﻮﻧﺪ.
global X Y Z
در اﻳﻦ ﻋﺒﺎرت ﻣﺘﻐﻴﺮﻫﺎي y ،xو zﻛﻪ در آﻧﻬﺎ ﺑﻴﺎن ﻣﻲﺷﻮﻧﺪ ،وﻗﺘﻲ ﭼﻨﺪ ﺗﺎﺑﻊ ﻳﻚ ﻣﺘﻐﻴﺮ ﻛﻠﻲ را ﺑﻴﺎن ﻛﻨﻨﺪ ،ﻳﻚ ﻧﺴﺨﻪ واﺣﺪي از آن ﻣﺘﻐﻴﺮ را
دارﻧﺪ .ﺗﺎﺑﻊ داﺧﻠﻲ و ﻣﺘﺪاول ﻫﺎﻓﻤﻦ ﺑﺎ ﻧﺎم makecodeﺧﺼﻮﺻﻴﺎت ﻣﺸﺘﺮﻛﻲ ﺑﺎ ﻣﺘﻐﻴﺮ ﻛﻠﻲ codeدارد .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻣﻌﻤﻮﻻً اﺳﺎﻣﻲ
ﻣﺘﻐﻴﺮﻫﺎي ﻛﻠﻲ ﺑﺎ ﺣﺮوف ﺑﺰرگ ﻧﻮﺷﺘﻪ ﻣﻲﺷﻮد .ﻣﺘﻐﻴﺮﻫﺎي ﻏﻴﺮﻛﻠﻲ ﻣﺘﻐﻴﺮﻫﺎي ﻣﻮﺿﻌﻲ ﻫﺴﺘﻨﺪ و ﻓﻘﻂ در اﺧﺘﻴﺎر ﺗﺎﺑﻌﻬﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ در آﻧﻬﺎ
ﺗﻌﺮﻳﻒ ﻣﻲﺷﻮﻧﺪ )ﻧﻪ در اﺧﺘﻴﺎر ﺳﺎﻳﺮ ﺗﺎﺑﻌﻬﺎ ﻳﺎ ﻓﻀﺎي ﻛﺎري ﻣﺒﻨﺎ( .آﻧﻬﺎ ﻣﻌﻤﻮﻻً ﺑﺎ ﺣﺮوف ﻛﻮﭼﻚ ﻧﻮﺷﺘﻪ ﻣﻲﺷﻮﻧﺪ .در ﻫﺎﻓﻤﻦ ﺑﺮاي اﺟﺮاي code
11
اﻳﻦ دﺳﺘﻮر،ﺗﻌﺪاد m*nآراﻳﻪ از ﻣﺎﺗﺮﻳﺴﻬﺎي ﺧﺎﻟﻲ اﻳﺠﺎد ﻣﻲﻛﻨﺪ ﻛﻪ ﺑﺮ اﺳﺎس ﺳﻠﻮل ﻳﺎ ﻣﺤﺘﻮا ﻣﺮﺟﻊ ﮔﺬاري ﻣﻲﺷﻮﻧﺪ .ﭘﺮاﻧﺘﺰ ﺑﺮاي
ﺷﺎﺧﺺﮔﺬاري ﺳﻠﻮﻟﻬﺎ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد .از ")(" ﺑﺮاي ﺷﺎﺧﺺﮔﺬاري ﻣﺤﺘﻮا اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﺑﻨﺎ ﺑﺮ اﻳﻦ ][=) x(1ﺷﺎﺧﺺ اﺳﺖ و ﻋﻨﺼﺮ 1
را از اراﻳﻪ ﺳﻠﻮﻟﻲ ﺑﺮﻣﻲدارد در ﺣﺎﻟﻲ ﻛﻪ ][ = } x{1ﻣﺠﻤﻮﻋﻪ اوﻟﻴﻦ ﻋﻨﺼﺮ آراﻳﻪ ﺳﻠﻮل را در ﻣﺎﺗﺮﻳﺲ ﺧﺎﻟﻲ ﻗﺮار ﻣﻲدﻫﺪ.
ﻳﻌﻨﻲ } x{1اﺷﺎره ﺑﻪ ﻣﺤﺘﻮﻳﺎت اوﻟﻴﻦ ﻋﻨﺼﺮ دارد .آراﻳﻪ ) x: x(1ﺑﻴﺸﺘﺮ اﺷﺎره ﺑﻪ ﻋﻨﺼﺮ دارد ﺗﺎ ﻣﺤﺘﻮﻳﺎت آن .از آﻧﺠﺎﺋﻲ ﻛﻪ ﻣﻲﺗﻮان آراﻳﻪﻫﺎي
ﺳﻠﻮﻟﻲ را در ﺳﺎﻳﺮ اراﻳﻪﻫﺎي ﺳﻠﻮﻟﻲ ﺗﻌﺒﻴﻪ ﻛﺮد ﺗﺮﻛﻴﺐ } x{1}{2اﺷﺎره ﺑﻪ ﻣﺤﺘﻮاي ﻋﻨﺼﺮ دوم آراﻳﻪ ﺳﻠﻮﻟﻲ دارد ﻛﻪ در اوﻟﻴﻦ ﻋﻨﺼﺮ آراﻳﻪ
ﺳﻠﻮﻟﻲ اﻳﻜﺲ اﺳﺖ.ﭘﺲ از راه اﻧﺪازي codeو ﻫﻨﺠﺎرﻣﻨﺪ ﻛﺮدن ﺑﺮدار اﺣﺘﻤﺎﻻت دادهﻫﺎي ورودي در ﻋﺒﺎرت ) p = p/sum (pﻛﺪ ﻫﺎﻓﻤﻦ
ﺑﺮاي ﺑﺮدار اﺣﺘﻤﺎﻻت ﻫﻨﺠﺎرﻣﻨﺪ ﺷﺪه ﻃﻲ 2ﻣﺮﺣﻠﻪ اﻳﺠﺎد ﻣﻲﺷﻮد .ﻣﺮﺣﻠﻪ اول ﻛﻪ ﺑﺎ ﻋﺒﺎرت اﺻﻠﻲ روال ) s=reduce (pراه اﻧﺪازي ﻣﻲﺷﻮد،
ﺗﺎﺑﻊ دروﻧﻲ reduceرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ ﻛﻪ وﻇﻴﻔﻪ آن ﻛﺎﻫﺶ ﻣﻨﺒﻊ اﺳﺖ ﻛﻪ در ﺗﺼﻮﻳﺮ (a).6.2دﻳﺪه ﻣﻲﺷﻮد .در اﻳﻦ روﻧﺪ ﻋﻨﺎﺻﺮ اراﻳﻪ
ﺳﻠﻮﻟﻲ ﻛﻪ در اﺑﺘﺪا ﺧﺎﻟﻲ ﺑﻮده اﺳﺖ و ﺑﺎ codeﻣﻨﻄﺒﻖ ﺷﺪه اﺳﺖ ﺑﺎ ﺷﺎﺧﺼﻬﺎي ﻣﺮﺑﻮﻃﻪ راه اﻧﺪازي ﻣﻲﺷﻮﻧﺪ .ﻳﻌﻨﻲ s{1}=1, s{2}=2و
ﻏﻴﺮه .ﺳﭙﺲ ﺳﻠﻮل ﻣﻌﺎدل ﻧﻤﻮدار دودوﻳﻲ ﻛﺎﻫﺸﻬﺎي ﻣﻨﺒﻊ در ﺣﻠﻘﻪ while numel (s) > 2اﻳﺠﺎد ﻣﻲﺷﻮد .در ﻫﺮ دﻓﻌﻪ ﺗﻜﺮار اﻳﻦ ﺣﻠﻘﻪ
ﺑﺮدار pﺑﺮ ﺣﺴﺐ اﻓﺰاﻳﺶ اﺣﺘﻤﺎﻻت ﻣﺮﺗﺐ ﻣﻲﺷﻮد .اﻳﻦ ﻛﺎر ﺑﺎ ﺗﺎﺑﻊ ) sortﻳﻌﻨﻲ ﻣﺮﺗﺐ ﺳﺎزي( اﻧﺠﺎم ﻣﻲﺷﻮد ﻛﻪ ﺗﺮﻛﻴﺐ ﻛﻠﻲ آن ﺑﻪ ﺷﺮح زﻳﺮ
اﺳﺖ:
)[y, i] = sort(x
دادهﻫﺎي ﺧﺮوﺟﻲ yﻋﻨﺎﺻﺮ ﻣﺮﺗﺐ ﺷﺪه اﻳﻜﺲ ﻫﺴﺘﻨﺪ و iﻃﻮري اﺳﺖ ﻛﻪ ) y=x(iاﺳﺖ .ﭘﺲ از ﻣﺮﺗﺐ ﺷﺪن pاﻳﻦ دو اﺣﺘﻤﺎل در ) p(2ﺑﺎ
ﻫﻢ ادﻏﺎم ﻣﻲﺷﻮﻧﺪ و ) p(1ﺑﺮﻳﺪه ﻣﻲﺷﻮد .ﺳﭙﺲ ﺳﻠﻮل ﻛﺎﻫﺶ ﻣﻨﺒﻊ دوﺑﺎره ﻣﺮﺗﺐ ﻣﻲﺷﻮد ﺗﺎ ﻣﻨﻄﺒﻖ ﺑﺮ pﺑﺮ اﺳﺎس ﺑﺮدار ﺷﺎﺧﺺ iﺑﺎ اﺳﺘﻔﺎده
از ) s=s(iﺑﺎﺷﺪ .ﺑﺎﻻﺧﺮه } s{2ﺑﺎ آراﻳﻪ ﺳﻠﻮﻟﻲ دو ﻋﻨﺼﺮي ﺣﺎوي ﺷﺎﺧﺼﻬﺎي اﺣﺘﻤﺎل ادﻏﺎم ﺷﺪه از ﻃﺮﻳﻖ }} s{2}={s{1},s{2ﺟﺎﻳﮕﺰﻳﻦ
ﻣﻲﺷﻮد) .اﻳﻦ ﻳﻚ ﻧﻤﻮﻧﻪ از ﺷﺎﺧﺺﮔﺬاري ﻣﺤﺘﻮا اﺳﺖ( .ﺷﺎﺧﺺﮔﺬاري ﺳﻠﻮل ﺑﺮاي ﺑﺮﻳﺪن اوﻟﻴﻦ ﻋﻨﺼﺮ از دو ﻋﻨﺼﺮ ادﻏﺎم ﺷﺪه ) s(1از
ﻃﺮﻳﻖ][=) s(1ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد .اﻳﻦ ﻓﺮاﻳﻨﺪ آﻧﻘﺪر ﺗﻜﺮار ﻣﻲﺷﻮد ﺗﺎ ﻓﻘﻂ دو ﻋﻨﺼﺮ در sﺑﺎﻗﻲ ﺑﻤﺎﻧﻨﺪ.
;)celldisp(s
;)cellplot(s
12
دادهﻫﺎي ﺧﺮوﺟﻲ ﻓﺮاﻳﻨﺪ اﺣﺘﻤﺎﻻت ﻧﻤﺎدﻫﺎ در ﺟﺪول 6.1و ﺗﺼﻮﻳﺮ (a).6.2در ﺗﺼﻮﻳﺮ 6.3ﻧﺸﺎن داده ﺷﺪه اﺳﺖ .ﺗﺼﻮﻳﺮﻫﺎي .6.3ب و ﺳﻲ ﺑﺎ
ﺗﺎﺑﻊ celldispﻧﺮم اﻓﺰار MATLABﻣﺤﺘﻮﻳﺎت آراﻳﻪ ﺳﻠﻮل را ﻣﻜﺮراٌ ﻧﻤﺎﻳﺶ ﻣﻲدﻫﺪ .ﺗﺎﺑﻊ cellplotﺗﺼﻮﻳﺮ ﮔﺮاﻓﻴﻜﻲ ﻳﻚ آراﻳﻪ ﺳﻠﻮﻟﻲ ﺑﻪ
ﺻﻮرت ﺟﻌﺒﻪﻫﺎي ﺗﻮدرﺗﻮ اﺳﺖ .ﺑﻪ ﺗﻄﺎﺑﻖ ﻳﻚ ﺑﻪ ﻳﻚ ﻋﻨﺎﺻﺮ آراﻳﻪ ﺳﻠﻮﻟﻲ در ﺗﺼﻮﻳﺮ .6.3ب و ﮔﺮهﻫﺎي درﺧﺖ ﻛﺎﻫﺶ ﻣﻨﺒﻊ در ﺗﺼﻮﻳﺮ (a).6.3
ﺗﻮﺟﻪ ﻛﻨﻴﺪ.
) (1ﻫﺮ ﻳﻚ از ﻣﺴﻴﺮﻫﺎي دو ﺷﺎﺧﻪ در اﻳﻦ ﻧﻤﻮدار )ﻛﻪ ﻧﻤﺎﻳﺎﻧﮕﺮ ﻛﺎﻫﺶ ﻣﻨﺒﻊ اﺳﺖ( ﻣﻄﺎﺑﻖ ﺑﺎ ﻳﻚ اراﻳﻪ ﺳﻠﻮﻟﻲ دو ﻋﻨﺼﺮي در sاﺳﺖ.
) (2ﻫﺮ ﻳﻚ از آراﻳﻪﻫﺎي ﺳﻠﻮﻟﻲ دو ﻋﻨﺼﺮي ﺣﺎوي ﺷﺎﺧﺼﻬﺎي ﻧﻤﺎدﻫﺎﻳﻲ اﺳﺖ ﻛﻪ در ﻛﺎﻫﺶ ﻣﻨﺒﻊ ﻣﻄﺎﺑﻖ ﺑﺎ آﻧﻬﺎ ادﻏﺎم ﺷﺪﻧﺪ.
ﻣﺜﻼً ادﻏﺎم ﻧﻤﺎدﻫﺎي a3 , a1در اﻧﺘﻬﺎي اﻳﻦ ﻧﻤﻮدار آراﻳﻪ ﺳﻠﻮﻟﻲ دو ﻋﻨﺼﺮي } s{1}{2را اﻳﺠﺎد ﻣﻲﻛﻨﺪ .در اﻳﻨﺠﺎ s{1}{2}{1}=3و
s{1}{2}{2}=1ﺑﻪ ﺗﺮﺗﻴﺐ ﺷﺎﺧﺼﻬﺎي ﻧﻤﺎد a3, a1ﻫﺴﺘﻨﺪ .رﻳﺸﻪ اﻳﻦ درﺧﺖ آراﻳﻪ ﺳﻠﻮﻟﻲ دو ﻋﻨﺼﺮي ﻓﻮﻗﺎﻧﻲ اﺳﺖ.
ﮔﺎم ﻧﻬﺎﻳﻲ در ﻓﺮاﻳﻨﺪ ﺗﻮﻟﻴﺪ رﻣﺰ )ﻳﻌﻨﻲ ﺗﺨﺼﻴﺺ رﻣﺰﻫﺎ ﺑﺮ اﺳﺎس آراﻳﻪ ﺳﻠﻮﻟﻲ ﻛﺎﻫﺶ ﻣﻨﺒﻊ (sﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﻋﺒﺎرت ﻧﻬﺎﻳﻲ ﻫﺎﻓﻤﻦ ﻳﻌﻨﻲ
)][ makecode(s,اﺟﺮا ﻣﻲﺷﻮد .اﻳﻦ ﻓﺮاﺧﻮاﻧﻲ ﺑﺎﻋﺚ راه اﻧﺪازي ﻓﺮاﻳﻨﺪ ﺗﺨﺼﻴﺺ رﻣﺰﻫﺎي ﺗﻜﺮاري ﺑﺮ اﺳﺎس روش ﺗﺼﻮﻳﺮ (b)6.2ﻣﻲﺷﻮد.
ﮔﺮﭼﻪ ﺗﻜﺮار ﺑﺎﻋﺚ ﺻﺮﻓﻪ ﺟﻮﻳﻲ در ذﺧﻴﺮه ﺳﺎزي )زﻳﺮا ﻣﻘﺎدﻳﺮ ﭘﺮدازش ﺷﺪه ﺑﺎﻳﺪ ﺟﺎي دﻳﮕﺮ ﻧﮕﻬﺪاري ﺷﻮﻧﺪ( و ﻳﺎ اﻓﺰاﻳﺶ ﺳﺮﻋﺖ ﻧﻤﻲﺷﻮد وﻟﻲ
ﻣﺰﻳﺘﺶ آن اﺳﺖ ﻛﻪ رﻣﺰ ﻓﺸﺮده اﺳﺖ و درك آن آﺳﺎن اﺳﺖ ﻣﺨﺼﻮﺻﺎً ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ دادهﻫﺎﻳﻲ ﻛﻪ ﺑﻪ ﺷﻜﻞ ﺗﻜﺮاري ﺗﻌﺮﻳﻒ ﺷﺪهاﻧﺪ ﻣﺎﻧﻨﺪ
ﻧﻤﻮدارﻫﺎي درﺧﺘﻲ .ﻫﺮ ﻳﻚ از ﺗﺎﺑﻌﻬﺎي ﻧﺮم اﻓﺰار MATLABرا ﻣﻲﺗﻮان ﺑﻪ ﺻﻮرت ﺗﻜﺮاري اﺳﺘﻔﺎده ﻛﺮد ﻳﻌﻨﻲ ﻣﻲﺗﻮان آﻧﻬﺎ را ﻣﺴﺘﻘﻴﻤﺎً ﻳﺎ
ﻏﻴﺮﻣﺴﺘﻘﻴﻢ ﻓﺮاﺧﻮاﻧﻲ ﻛﺮد .ﻫﻨﮕﺎم ﺑﺎزﮔﺸﺖ در ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻌﻬﺎ ﻣﺠﻤﻮﻋﻪ ﺗﺎزهاي از ﻣﺘﻐﻴﺮﻫﺎي ﻣﻮﺿﻌﻲ اﻳﺠﺎد ﻣﻲﺷﻮﻧﺪ ﻛﻪ ﻣﺴﺘﻘﻞ از ﻫﻤﻪ
ﺗﺎﺑﻊ دروﻧﻲ makecodeدو ﻧﻮع داده ورودي را ﻗﺒﻮل ﻣﻲﻛﻨﺪ codeword :ﻛﻪ آراﻳﻪاي از ﺻﻔﺮﻫﺎ و ﻳﻜﻬﺎ اﺳﺖ و scﻛﻪ ﻋﻨﺼﺮ آراﻳﻪ ﺳﻠﻮﻟﻲ
ﻛﺎﻫﺶ ﻣﻨﺒﻊ اﺳﺖ .وﻗﺘﻲ scﺧﻮدش ﻳﻚ اراﻳﻪ ﺳﻠﻮﻟﻲ ﺑﺎﺷﺪ ،ﺣﺎوي دو ﻧﻤﺎد )ﺗﺮﻛﻴﺒﻲ( ﻣﻨﺒﻊ اﺳﺖ ﻛﻪ در ﻓﺮاﻳﻨﺪ ﻛﺎﻫﺶ ﻣﻨﺒﻊ ﺑﺎ ﻳﻜﺪﻳﮕﺮ ادﻏﺎم
ﺷﺪهاﻧﺪ .از آﻧﺠﺎﺋﻲ ﻛﻪ آﻧﻬﺎ ﺑﺎﻳﺪ اﻧﻔﺮادي رﻣﺰﮔﺬاري ﺷﻮﻧﺪ mkecode ،ﻣﻜﺮراٌ در ﻋﻨﺎﺻﺮ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﺷﻮد ﻛﻪ ﻫﻤﺮاه ﺑﺎ دو ﻛﻠﻤﻪ رﻣﺰي اﺳﺖ ﻛﻪ
روزﻳﻨﻪ ﻣﻲﺷﻮﻧﺪ )ﺻﻔﺮﻫﺎ و ﻳﻚ ﺑﻪ ﻛﻠﻤﻪ رﻣﺰ ورودي ﺿﻤﻴﻤﻪ ﻣﻲﺷﻮﻧﺪ .وﻗﺘﻲ scﺣﺎوي اراﻳﻪ ﺳﻠﻮل ﻧﺒﺎﺷﺪ ،ﺷﺎﺧﺺ ﻧﻤﺎد ﻣﻨﺒﻊ اﺻﻠﻲ اﺳﺖ و
رﺷﺘﻪ دودوﻳﻲ اﻳﺠﺎد ﺷﺪه از ﻛﻠﻤﻪ رﻣﺰ ورودي ﺑﺎ اﺳﺘﻔﺎده از ) code (sc) = char (0 +codewordﺑﻪ آن ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮد .ﻫﻤﺎن
ﻃﻮر ﻛﻪ ﮔﻔﺘﻴﻢ ،ﺗﺎﺑﻊ charدر ﻧﺮم اﻓﺰار MATLABآراﻳﻪﻫﺎي ﺣﺎوي اﻋﺪاد ﺻﺤﻴﺢ ﻣﺜﺒﺖ را ﻛﻪ ﻧﻤﺎﻳﺎﻧﮕﺮ رﻣﺰﻫﺎي ﻧﻮﻳﺴﻪ ﻫﺴﺘﻨﺪ ﺑﻪ آراﻳﻪ
13
ﻧﻮﻳﺴﻪ MATLABﺗﺒﺪﻳﻞ ﻣﻲﻛﻨﺪ ) 127رﻣﺰ اول اﺳﻜﻲ ﻫﺴﺘﻨﺪ( .ﻣﺜﻼً )] char(‘0’+[010رﺷﺘﻪ ’ ‘010را ﺗﻮﻟﻴﺪ ﻣﻲﻛﻨﺪ زﻳﺮا اﻓﺰودن
ﺻﻔﺮ ﺑﻪ ﻛﺪ اﺻﻠﻲ ﺑﻪ ازاي ﻫﺮ ﺻﻔﺮ ﻳﻚ ﺻﻔﺮ اﺳﻜﻲ ﺗﻮﻟﻴﺪ ﻣﻲﻛﻨﺪ در ﺣﺎﻟﻲ ﻛﻪ اﻓﺰودن 1ﺑﻪ اﺳﻜﻲ ﺻﻔﺮ ﻓﻘﻂ ﻛﺪ اﺳﻜﻲ 1را اﻳﺠﺎد ﻣﻲﻛﻨﺪ.
در ﺟﺪول 6.2ﺟﺰﺋﻴﺎت روال ﻓﺮاﺧﻮاﻧﻲ makecodeﻛﻪ ﻧﺘﺎﻳﺞ آن در آراﻳﻪ ﺳﻠﻮﻟﻲ ﻛﺎﻫﺶ ﻣﻨﺒﻊ ﺗﺼﻮﻳﺮ 6.3دﻳﺪه ﻣﻲﺷﻮد .ﺑﺮاي رﻣﺰﮔﺬاري
ﭼﻬﺎر ﻧﻤﺎد ﻣﻨﺒﻊ ﻫﻔﺖ ﻓﺮاﺧﻮاﻧﻲ ﻣﻮرد ﻧﻴﺎز اﺳﺖ .اوﻟﻴﻦ ﻓﺮاﺧﻮاﻧﻲ )ردﻳﻒ 1ازﺟﺪول (6.2از روال اﺻﻠﻲ ﻫﺎﻓﻤﻦ اﻧﺠﺎم ﻣﻲﺷﻮد و ﻓﺮاﻳﻨﺪ
رﻣﺰﮔﺬاري را ﺑﺎ دادهﻫﺎي ورودي ﻛﻠﻤﻪ رﻣﺰ راه اﻧﺪازي ﻣﻲﻛﻨﺪ و scﺑﻪ ﺗﺮﺗﻴﺐ ﺑﻪ ﻣﺎﺗﺮﻳﺲ ﺧﺎﻟﻲ و آراﻳﻪ ﺳﻠﻮﻟﻲ sﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮد.
} {1*2cellﺑﺮ اﺳﺎس ﻧﺸﺎﻧﻪﮔﺬارﻳﻬﺎي ﻧﺮم اﻓﺰار MATLABﺑﻪ ﻣﻌﻨﻲ آراﻳﻪ ﺳﻠﻮﻟﻲ ﺗﻚ ردﻳﻔﻪ دو ﺳﺘﻮﻧﻲ اﺳﺖ .از آﻧﺠﺎﺋﻲ ﻛﻪ scﻫﻤﻴﺸﻪ
آراﻳﻪ ﺳﻠﻮﻟﻲ در اوﻟﻴﻦ ﻓﺮاﺧﻮاﻧﻲ اﺳﺖ )ﻣﻨﺒﻊ ﻧﻤﺎد ﺗﻜﻲ ﻳﻚ اﺳﺘﺜﻨﺎ اﺳﺖ( دو ﻓﺮاﺧﻮاﻧﻲ ﻣﻜﺮر ردﻳﻔﻬﺎي 2و 7ﺟﺪول اﻧﺠﺎم ﻣﻲﺷﻮد .اوﻟﻴﻦ
ﻓﺮاﺧﻮاﻧﻲ دو ﻓﺮاﺧﻮاﻧﻲ دﻳﮕﺮ را ﻧﻴﺰ راه اﻧﺪازي ﻣﻲﻛﻨﺪ ﻛﻪ ردﻳﻔﻬﺎي 3و 4ﻫﺴﺘﻨﺪ .و دوﻣﻴﻦ ﻣﻮرد ردﻳﻔﻬﺎي 5و 6را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ.
ﺟﺪول :6.2ﻓﺮاﻳﻨﺪ ﺗﺨﺼﻴﺺ رﻣﺰ در اراﻳﻪ ﺳﻠﻮﻟﻲ ﻛﺎﻫﺶ ﻣﻨﺒﻊ در ﺗﺼﻮﻳﺮ 6.3
ﻫﺮ دﻓﻌﻪ ﻛﻪ scﻳﻚ اراﻳﻪ ﺳﻠﻮﻟﻲ ﻧﺒﺎﺷﺪ ،ﻫﻤﭽﻮن ردﻳﻔﻬﺎي 6 ،5 ،3و 7ﺟﺪول ﺗﻜﺮارﻫﺎي اﺿﺎﻓﻲ ﺑﺎﻳﺪ اﻧﺠﺎم ﺷﻮﻧﺪ .رﺷﺘﻪ رﻣﺰ از codeword
اﻳﺠﺎد ﻣﻲﺷﻮد و ﺑﻪ ﻧﻤﺎد ﻣﻨﺒﻌﻲ ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮد ﻛﻪ ﺷﺎﺧﺺ آن scﺑﻮده اﺳﺖ.
رﻣﺰﮔﺬاري ﻫﺎﻓﻤﻦ ﺑﻪ ﺧﻮدي ﺧﻮد ﻓﺸﺮدهﺳﺎزي ﻣﺤﺴﻮب ﻧﻤﻲﺷﻮد .ﺑﺮاي درك روش ﻓﺸﺮدهﺳﺎزي ﺗﻌﺒﻴﻪ ﺷﺪه در رﻣﺰﻫﺎي ﻫﺎﻓﻤﻦ ﻧﻤﺎدﻫﺎﻳﻲ ﻛﻪ
رﻣﺰﻫﺎ در آن اﻳﺠﺎد ﺷﺪه اﺳﺖ ﭼﻪ از ﻧﻮع ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺑﺎﺷﻨﺪ و ﻳﺎ دادهﻫﺎي ﺧﺮوﺟﻲ ﺳﺎﻳﺮ ﻋﻤﻠﻴﺎت ﺗﺮﺳﻴﻢ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺑﺎﺷﻨﺪ ﺑﺎﻳﺪ
ﻣﻄﺎﺑﻖ ﺑﺎ رﻣﺰﻫﺎي ﺗﻮﻟﻴﺪ ﺷﺪه ﺗﺒﺪﻳﻞ ﻳﺎ ﻧﻘﺸﻪ ﺑﺮداري )ﻳﻌﻨﻲ رﻣﺰﮔﺬاري( ﺷﻮﻧﺪ.
ﻣﺜﺎل :6.2
14
>> f2 = uint8([2 3 4 ;2 3 2 4 ;4 2 2 1 ;2 1 1 2 )]2
= f2
2 3 4 2
3 2 4 4
2 2 1 2
1 1 2 2
)'>> whos('f2
Name Size Bytes Class
F2 4×4 16 uint8 array
Grand total is 16 elements using 16 bytes
ﻫﺮ ﻋﻨﺼﺮ ﺗﺼﻮﻳﺮي در f2ﻳﻚ ﺑﺎﻳﺖ ﺣﺎوي 8ﺑﻴﺖ اﺳﺖ .ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﻞ ﺗﺼﻮﻳﺮ از 16ﺑﺎﻳﺖ اﺳﺘﻔﺎده ﻣﻲﺷﻮد .از آﻧﺠﺎﺋﻲ ﻛﻪ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي
f2اﺣﺘﻤﺎﻻت ﻳﻜﺴﺎن ﻧﺪارﻧﺪ ،ﻳﻚ رﻣﺰ ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ )ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﺑﺨﺶ آﺧﺮ ﮔﻔﺘﻴﻢ( ﻣﻘﺪار ﺣﺎﻓﻈﻪ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﻤﺎﻳﺶ ﺗﺼﻮﻳﺮ را
از آﻧﺠﺎﺋﻲ ﻛﻪ رﻣﺰﻫﺎي ﻫﺎﻓﻤﻦ ﺑﺮ اﺳﺎس ﺗﻌﺪاد دﻓﻌﺎت ﻧﺴﺒﻲ وﻗﻮع ﻧﻤﺎدﻫﺎي ﻣﻨﺒﻊ رﻣﺰﮔﺬاري ﺷﺪه ﻫﺴﺘﻨﺪ ﻧﻪ ﺧﻮد ﻧﻤﺎدﻫﺎ c ،ﻣﺎﻧﻨﺪ رﻣﺰي اﺳﺖ
ﻛﻪ ﺑﺮاي ﺗﺼﻮﻳﺮ ﻣﺜﺎل 6.1اﻳﺠﺎد ﺷﺪ .در واﻗﻊ ﻣﻲﺗﻮان ﺑﺎ ﺗﺮﺳﻴﻢ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي 107و ،123 ،119و 168ﺑﻪ ﺗﺮﺗﻴﺐ ﺗﺎ 3 ،2 ،1و 4ﺗﺼﻮﻳﺮ
ﻳﻚ روش ﺳﺎده ﺑﺮاي رﻣﺰﮔﺬاري اف 2ﺑﺮ اﺳﺎس رﻣﺰ cاﺟﺮاي ﻋﻤﻠﻴﺎت ﺟﺴﺘﺠﻮي ﺳﺎده اﺳﺖ.
'))>> h1f2 = c(f2(:
= h1f2
Columns 1 through 9
''1 ''010' '1 ''011' '010' '1 ''1 ''011' '00
Columns 10 through 16
''00' '011' '1 ''1 ''00' '1 ''1
)'>> whos('h1f2
Name Size Bytes Class
h1f2 1×16 1530 cell array
Grand total is 45 elements using 1530 bytes
در اﻳﻨﺠﺎ f2ﻳﻚ اراﻳﻪ دو ﺑﻌﺪي از ﻧﻮع uint8اﺳﺖ ﻛﻪ ﺑﻪ اراﻳﻪ ﺳﻠﻮل 16*1ﺗﺒﺪﻳﻞ ﻣﻲﺷﻮد h1f2ﺟﺎﺑﺠﺎﻳﻲ اﺳﺖ ﻛﻪ ﻻﻳﻪ را ﻓﺸﺮده ﻣﻲﻛﻨﺪ.
ﻋﻨﺎﺻﺮ h1f2رﺷﺘﻪﻫﺎﻳﻲ ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻄﺎﺑﻖ ﺑﺎ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي f2از ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ و ﭼﭗ ﺑﻪ راﺳﺖ ﺑﺮرﺳﻲ ﻣﻲﺷﻮﻧﺪ .در اﻳﻦ
ﺗﺼﻮﻳﺮ رﻣﺰﮔﺬاري ﺷﺪه از 1530ﺑﺎﻳﺖ اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﻛﻪ 100ﺑﺮاﺑﺮ ﺣﺎﻓﻈﻪ ﻣﻮرد ﻧﻴﺎز ﺗﻮﺳﻂ f2ﻫﺴﺘﻨﺪ.
اﺳﺘﻔﺎده از اراﻳﻪ ﺳﻠﻮﻟﻲ h1f2ﻣﻨﻄﻘﻲ اﺳﺖ ﭼﻮن ﻛﻪ ﻳﻜﻲ از ﺳﺎزهﻫﺎي اﺳﺘﺎﻧﺪارد دادهﻫﺎي MATLABاﺳﺖ ﻛﻪ ﺑﺮاي ﻛﺎر ﺑﺎ آراﻳﻪﻫﺎي
دادهﻫﺎي ﻧﺎﻣﺸﺎﺑﻪ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد .اﻳﻦ اﺧﺘﻼف در ﻣﻮرد h1f2ﻣﺮﺑﻮط ﺑﻪ ﻃﻮل رﺷﺘﻪﻫﺎي ﻧﻮﻳﺴﻪ اﺳﺖ و ﺑﻬﺎي ﭘﺮداﺧﺖ ﺷﺪه ﺑﺮاي ﻛﺎر ﺑﺎ آن
15
از ﻃﺮﻳﻖ آراﻳﻪ ﺳﻠﻮﻟﻲ ﺟﺰو ﻫﺰﻳﻨﻪﻫﺎي ﻋﻤﻮﻣﻲ ﺣﺎﻓﻈﻪ ﻣﺤﺴﻮب ﻣﻲﺷﻮد )ﻛﻪ در آراﻳﻪ ﺳﻠﻮﻟﻲ درج ﺷﺪه اﺳﺖ( ﻛﻪ ﺑﺮاي ردﻳﺎﺑﻲ ﻣﻮﻗﻌﻴﺖ
ﻋﻨﺎﺻﺮي ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد .ﺑﺎ ﺗﺒﺪﻳﻞ h1f2ﺑﻪ ﻳﻚ آراﻳﻪ ﻧﻮﻳﺴﻪ دو ﺑﻌﺪي ﻣﺘﻌﺎرف ﻣﻲﺗﻮان از ﻫﺰﻳﻨﻪﻫﺎي ﻋﻤﻮﻣﻲ اﺟﺘﻨﺎب ﻛﺮد.
')>> h2f2 = char(h1f2
= h2f2
1010011000011011
1 11 1001 0
0 10 1 1
)'>> whos('h2f2
Name Size Bytes Class
h2f2 3×16 96 char array
Grand total is 48 elements using 96 bytes
در اﻳﻨﺠﺎ آراﻳﻪ ﺳﻠﻮﻟﻲ h1f2ﺑﻪ آراﻳﻪ ﻧﻮﻳﺴﻪ h2f2 16*3ﺗﺒﺪﻳﻞ ﻣﻲﺷﻮد .ﻫﺮ ﺳﺘﻮن از h2f2ﻣﻄﺎﺑﻖ ﺑﺎ ﻳﻚ ﻋﻨﺼﺮ ﺗﺼﻮﻳﺮي از f2اﺳﺖ ﻛﻪ از
ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ و ﭼﭗ ﺑﻪ راﺳﺖ ﺑﺮرﺳﻲ ﻣﻲﺷﻮﻧﺪ .ﺑﻠﻮﻛﻬﺎ ﺑﺮاي اﻧﺪازه ﮔﻴﺮي ﺻﺤﻴﺢ آراﻳﻪ درج ﻣﻲﺷﻮﻧﺪ از آﻧﺠﺎﺋﻲ ﻛﻪ ﺑﺮاي ﻫﺮ 0و 1ﻛﻠﻤﻪ رﻣﺰ ﺑﻪ
دو ﺑﺎﻳﺖ ﻧﻴﺎز اﺳﺖ ﻛﻞ ﺣﺎﻓﻈﻪ ﻣﻮرد اﺳﺘﻔﺎده ﺗﻮﺳﻂ 96 h2f2ﺑﺎﻳﺖ اﺳﺖ ﻛﻪ 6ﻣﺮﺗﺒﻪ ﺑﻴﺸﺘﺮ از 16ﺑﺎﻳﺖ اﺻﻠﻲ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي f2اﺳﺖ.
ﻣﻲﺗﻮان ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ درج ﺷﺪه را ﺑﺎ اﺳﺘﻔﺎده از رواﺑﻂ زﻳﺮ ﺣﺬف ﻛﺮد:
;)>> h2f2 = h2f2(:
;] [ = )' ' == >> h2f2(h2f2
)'>> whos('h2f2
Name Size Bytes Class
h2f2 29×1 58 char array
Grand total is 29 elements using 58 bytes
ﺑﺮاي ﻓﺸﺮدهﺳﺎزي f2رﻣﺰ cﺑﺎﻳﺪ در ﺳﻄﺢ ﺑﻴﺖ اﻋﻤﺎل ﺷﻮد و ﭼﻨﺪﻳﻦ ﻋﻨﺼﺮ ﺗﺼﻮﻳﺮي رﻣﺰﮔﺬاري ﺷﺪه در ﻳﻚ ﺑﺎﻳﺖ ﺟﻤﻊ ﺷﻮﻧﺪ.
)>> h3f2 = mat2huff(f2
=h3f2
]size: [4 4
min: 32769
]hist: [3 8 2 3
]code: [43867 1944
)'>> whos('h3f2
Name Size Bytes Class
h3f2 1×1 518 struct array
Grand total is 13 elements using 518 bytes
ﮔﺮﭼﻪ ﺗﺎﺑﻊ mat2huffﺳﺎﺧﺘﺎر h3f2را ﺗﻮﻟﻴﺪ ﻣﻲﻛﻨﺪ ﻛﻪ ﻧﻴﺎز ﺑﻪ 518ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ دارد اﻛﺜﺮ آن ﺑﺎ ﻳﻜﻲ از دو ﻣﻮرد زﻳﺮ ﻣﺮﺗﺒﻂ اﺳﺖ(1) :
ﻫﺰﻳﻨﻪﻫﺎي ﻋﻤﻮﻣﻲ ﻣﺘﻐﻴﺮ ﺳﺎزه )اﺳﺘﻔﺎده از imratioدر ﺑﺨﺶ 6.1ﺑﺮاي ﻳﺎدآوري اﻳﻦ MATLABﻛﻪ ﻧﺮم اﻓﺰار MATLABدر ﻫﺮ
ﻣﻴﺪان از ﺳﺎزه از 124ﺑﺎﻳﺖ ﺑﺮاي ﻫﺰﻳﻨﻪﻫﺎي ﻋﻤﻮﻣﻲ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ( و ) mat2huff (2اﻃﻼﻋﺎﺗﻲ ﺑﺮاي ﺗﺴﻬﻴﻞ رﻣﺰﮔﺸﺎﻳﻴﻬﺎي آﺗﻲ ﺗﻮﻟﻴﺪ
16
راf2 ،mat2huff ﺻﺮف ﻧﻈﺮ از اﻳﻦ ﻫﺰﻳﻨﻪﻫﺎي ﻋﻤﻮﻣﻲ ﻛﻪ ﻫﻨﮕﺎم ﺑﺮرﺳﻲ ﺗﺼﻮﻳﺮﻫﺎي ﻛﺎرﺑﺮدي ﺑﺎ اﻧﺪازه ﻋﺎدي ﻗﺎﺑﻞ ﭼﺸﻢ ﭘﻮﺷﻲ اﺳﺖ.ﻣﻲﻛﻨﺪ
: ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖh3f2 ﺑﻴﺘﻲ ﻓﺸﺮده ﻣﻲﺷﻮﻧﺪﻋﻨﺎﺻﺮ رﻣﺰ16 ﻛﻠﻤﻪ2 ﺑﻪf2 ﺑﻴﺘﻲ8 ﭘﻴﻜﺴﻞ16 ﻓﺸﺮدهﺳﺎزي ﻣﻲﻛﻨﺪ4:1 ﺑﺎ ﻋﺎﻣﻞ
>> hcode = h3f2.code;
>> whos('hcode')
Name Size Bytes Class
hcode 1×2 4 uint16 array
Grand total is 2 elements using 4 bytes
>> dec2bin(double(hcode))
ans =
1010101101011011
0000011110011000
( ﺻﻔﺮ آﺧﺮ3 ﻣﺪوﻟﻲ آﺧﺮ )ﻳﻌﻨﻲ16 ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮﻧﺪ و از ﺑﻴﺘﻬﺎيh3f2 ﺑﺮاي ﻧﻤﺎﻳﺶ ﻫﺮ ﻳﻚ از ﺑﻴﺘﻬﺎيdec2bin ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ
. ﺗﻮﻟﻴﺪ ﻛﺮدﻳﻢ6.2.1 ﺑﻴﺖ ﻓﻮري ﻣﻨﺤﺼﺮ ﺑﻪ ﻓﺮد اﺳﺖ ﻛﻪ ﻗﺒﻼً در ﺑﺨﺶ29 ﺑﻴﺖ ﻣﻌﺎدل ﺑﻠﻮﻛﻬﺎي32 رﻣﺰﮔﺬاري.ﺻﺮف ﻧﻈﺮ ﻣﻲﺷﻮد
ﺣﺎوي اﻃﻼﻋﺎت ﻻزم ﺑﺮاي رﻣﺰﮔﺸﺎﻳﻲ آراﻳﻪ رﻣﺰﮔﺬاري ﺷﺪه )ﻣﺜﻼً اﺣﺘﻤﺎﻻت ﻧﻤﺎدﻫﺎ وmat2huff ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﻣﺜﺎل ﻗﺒﻞ ﮔﻔﺘﻴﻢ ﺗﺎﺑﻊ
اﻃﻼﻋﺎت اﻳﻦ ﺳﺎﺧﺘﺎر در ﻣﻄﺎﻟﺐ راﻫﻨﻤﺎي ﺑﺨﺶ. ﻗﺮار دارﻧﺪMATLAB اﺑﻌﺎد اﺻﻠﻲ( اﺳﺖ ﻛﻪ در ﻳﻜﻲ از ﻣﺘﻐﻴﺮﻫﺎي ﺗﻜﻲ ﻧﺮم اﻓﺰار
17
% Store the size of input x.
y.size = unit32(size(x));
% Find the range of x values and store its minimum value biased
% by +32768 as a UINT16.
x = round(double(x));
xmin = min(x(:));
xmax = max(x(:));
pmin = double(int16(xmin));
pmin = uint16(pmin + 32768); y.min = pmin;
% Compute the input histogram between xmin and xmax with unit
% width bins, scale to UINT16, and store.
x = x(:)';
h = histc(x, xmin:xmax);
if max(h) > 65535
h = 65535 * h / max(h);
end
را ﺑﺎ اﺳﺘﻔﺎده از ﻣﺤﻔﻈﻪﻫﺎي ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎ ﺑﻪ ﭘﻬﻨﺎي واﺣﺪ ﺑﻴﻦ ﻣﻘﺎدﻳﺮx ﻫﺎﻓﻤﻦ ﻣﺎﺗﺮﻳﺲy=mat2huff (x) ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻋﺒﺎرت
ﺑﻌﺪاً رﻣﺰﮔﺸﺎﻳﻲ ﻣﻲﺷﻮﻧﺪ ﻛﺪ ﻫﺎﻓﻤﻦ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي رﻣﺰﮔﺸﺎﻳﻲy وﻗﺘﻲ دادهﻫﺎي رﻣﺰﮔﺬاري ﺷﺪه در. رﻣﺰﮔﺬاري ﻣﻲﻛﻨﺪx ﺣﺪاﻗﻞ و ﺣﺪاﻛﺜﺮ
ﺑﻪ ﺟﺎي ﺣﻔﻆ رﻣﺰ ﻫﺎﻓﻤﻦMat2huff . اﺳﺖ ﺳﺎﺧﺘﻪ ﺷﻮدx ﻛﻪ ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎيy.hist اﺳﺖ وx ﻛﻪ ﺣﺪاﻗﻞ ﻣﻘﺪارy.min آن ﺑﺎﻳﺪ دوﺑﺎره از
ذﺧﻴﺮه ﻣﻲﺷﻮد ﺗﺎﺑﻊy.size ﻛﻪ درx ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻦ ﻣﻮﺿﻮع و اﺑﻌﺎد اﺻﻠﻲ ﻣﺎﺗﺮﻳﺲ.اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﺗﻮﻟﻴﺪ ﻣﺠﺪد آن را ﻧﮕﻪ ﻣﻲدارد
: ﺑﻪ ﻃﻮر ﺧﻼﺻﻪ در اﻳﻨﺠﺎ ﺑﻴﺎن ﺷﺪه اﺳﺖy.code ﻣﺮاﺣﻞ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﺗﻮﻟﻴﺪ
ﺑﺎ اﺳﺘﻔﺎده از ﻣﺤﻔﻈﻪﻫﺎﻳﻲ ﺑﻪ ﭘﻬﻨﺎي واﺣﺪ ﻣﺤﺎﺳﺒﻪ ﻛﻨﻴﺪ وx ﺑﻴﻦ ﺣﺪاﻗﻞ و ﺣﺪاﻛﺜﺮ ﻣﻘﺎدﻳﺮx را ﺑﺎ دادهﻫﺎي وروديh اﺑﺘﺪا ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎي.1
. ﻣﻘﻴﺎس ﺑﻨﺪي ﺷﺪه اﺳﺖh اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻛﻪ در اﻳﻨﺠﺎ ﻧﻘﺸﻪاي ﻣﺒﺘﻨﻲ ﺑﺮ ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎيHuffman ﺑﺮاي اﻳﺠﺎد رﻣﺰ ﻫﺎﻓﻤﻦ از.2
18
.3دادهﻫﺎي ورودي xرا ﺑﺎ اﺳﺘﻔﺎده از ﻧﻘﺸﻪ ﺗﺮﺳﻴﻢ ﻛﻨﻴﺪ )ﺗﺎ ﻳﻚ آراﻳﻪ ﺳﻠﻮﻟﻲ اﻳﺠﺎد ﺷﻮد( و ﺳﭙﺲ آن را ﺑﻪ آراﻳﻪ ﻧﻮﻳﺴﻪاي hxﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ.
ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ درج ﺷﺪه ﻫﻤﭽﻮن h2f2در ﻣﺜﺎل 6.2را ﺑﺮﻃﺮف ﻛﻨﻴﺪ.
.4ﺑﺮدار hxرا ﻃﻮري درﺳﺖ ﻛﻨﻴﺪ ﻛﻪ ﻧﻮﻳﺴﻪﻫﺎي آن ﺑﻪ ﺻﻮرت ﻗﻄﻌﺎت 16واﺣﺪي در آﻳﺪ .اﻳﻦ ﻛﺎر ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺑﺮدار ﻧﻮﻳﺴﻪ 16ﻣﺪوﻟﻲ اﻧﺠﺎم
ﻣﻲﺷﻮد ﻛﻪ hx16را در رﻣﺰ ﻧﮕﻪ ﻣﻲدارد و ﻋﻨﺎﺻﺮ hxرا ﺑﻪ آن ﻛﭙﻲ ﻣﻲﻛﻨﺪ ،و آن را در ردﻳﻔﻬﺎي 16واﺣﺪي در آراﻳﻪ ysizeﺷﻜﻞدﻫﻲ
ﻣﻲﻛﻨﺪ .از ﺑﺨﺶ 4.2ﺑﻪ ﺧﺎﻃﺮ دارﻳﻢ ﻛﻪ ﺗﺎﺑﻊ ceilاﻋﺪاد را ﺑﻪ ﺳﻤﺖ ﻣﺜﺒﺖ ﺑﻴﻨﻬﺎﻳﺖ ﮔﺮد ﻣﻲﻛﻨﺪ .ﺗﺎﺑﻊ ﻛﻠﻲ ﻧﺮم اﻓﺰار MATLABﺑﻪ ﺷﺮح
زﻳﺮ اﺳﺖ:
)y = reshape(x, m, n
در اﻳﻨﺠﺎ mاز ﻣﺎﺗﺮﻳﺲ nﺗﻮﻟﻴﺪ ﻣﻲﺷﻮد ﻛﻪ ﻋﻨﺎﺻﺮ آن ﺑﻪ ﺻﻮرت ﺳﺘﻮﻧﻲ از xﮔﺮﻓﺘﻪ ﻣﻲﺷﻮﻧﺪ .اﮔﺮ اﻳﻜﺲ ﺗﻌﺪاد m*nﻋﺪد ﻋﻨﺼﺮ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ
.5ﻋﻨﺎﺻﺮ 16ﻧﻮﻳﺴﻪاي hx16را ﺑﻪ اﻋﺪاد دودوﻳﻲ 16ﺑﻴﺘﻲ ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ )ﻳﻌﻨﻲ .(uint16sاﻳﻦ 3ﻋﺒﺎرت در راﺑﻄﻪ ﻓﺸﺮده زﻳﺮ ﺟﺎﻳﮕﺰﻳﻦ
ﻣﻲﺷﻮﻧﺪ .y=uint16 :آﻧﻬﺎ ﻫﺴﺘﻪ اﺻﻠﻲ bin2decﻫﺴﺘﻨﺪ .ﻛﻪ ﻣﻌﺎدل اﻋﺸﺎري رﺷﺘﻪ دودوﻳﻲ را ﺗﻮﻟﻴﺪ ﻣﻲﻛﻨﺪ وﻟﻲ ﺳﺮﻳﻌﺘﺮ ﻫﺴﺘﻨﺪ زﻳﺮا
ﺟﻨﺒﻪﻫﺎي ﻋﻤﻮﻣﻲ آﻧﻬﺎ ﻛﺎﻫﺶ ﻳﺎﻓﺘﻪ اﺳﺖ .ﺗﺎﺑﻊ pow2yﻣﻄﻠﺐ ﺑﺮاي ﺗﻮﻟﻴﺪ اراﻳﻪاي ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد ﻛﻪ ﻋﻨﺎﺻﺮ آن 2ﺑﻪ ﺗﻮان yﻫﺴﺘﻨﺪ.
ﻣﺜﺎل :6.3ﺑﺮاي ﺗﺸﺮﻳﺢ ﺑﻴﺸﺘﺮ ﻋﻤﻠﻜﺮد ﻓﺸﺮدهﺳﺎزي روش رﻣﺰﮔﺬاري ﻫﺎﻓﻤﻦ ﻳﻚ ﺗﺼﻮﻳﺮ ﺗﻚ رﻧﮓ 8ﺑﻴﺘﻲ 512*512را در ﻋﻜﺲ (a).6.4ﻧﻈﺮ
ﺑﮕﻴﺮﻳﺪ .ﻓﺸﺮدهﺳﺎزي اﻳﻦ ﺗﺼﻮﻳﺮ ﺑﺎ اﺳﺘﻔﺎده از mat2huffﺑﺎ اﺟﺮاي دﺳﺘﻮرات زﻳﺮ روي ﺧﻂ ﻓﺮﻣﺎن ﺗﺤﻘﻖ ﻣﻲﻳﺎﺑﺪ.
;)'>> f = imread('Tracy.tif
;)>> c = mat2huff(f
)>> cr1 = imratio(f, c
=cr1
1.219
ﺗﺼﻮﻳﺮ :6.4ﻳﻚ ﺗﺼﻮﻳﺮ 8ﺑﻴﺘﻲ 512*512ﺗﻚ رﻧﮓ از ﻳﻚ زن و ﺑﺰرﮔﻨﻤﺎﻳﻲ ﭼﺸﻢ راﺳﺖ او
19
ﺑﺎ ﺣﺬف ﻛﺮدن دادهﻫﺎي اﺿﺎﻓﻲ ﻣﻮﺟﻮد در رﻣﺰﮔﺬاري دودوﻳﻲ 8ﺑﻴﺘﻲ ﻣﺘﻌﺎرف ﺗﺼﻮﻳﺮ ﺑﻪ %80اﻧﺪازه اﺻﻠﻲ ﺧﻮدش )ﺣﺘﻲ ﺑﺎ اﺣﺘﺴﺎب اﻃﻼﻋﺎت
از آﻧﺠﺎﺋﻲ ﻛﻪ دادهﻫﺎي ﺧﺮوﺟﻲ mat2huffﻳﻚ ﺳﺎزه ﻫﺴﺘﻨﺪ آﻧﻬﺎ را ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ saveروي دﻳﺴﻚ ذﺧﻴﺮه ﻣﻲﻛﻨﻴﻢ:
;>> save SqueezeTracy c
)'>> cr2 = imratio('Tracy.tif', 'SqueezeTracy.mat
= cr2
1.2365
ﺗﺎﺑﻊ saveﺑﺮاي ذﺧﻴﺮه ﺳﺎزي ﭘﺮوﻧﺪه ﺑﺎ ﺳﺎﻳﺮ ﭘﺴﻮﻧﺪﻫﺎ اﺳﺖ و در اﻳﻦ ﻣﻮرد ﭘﺮوﻧﺪه اﻳﺠﺎد ﺷﺪه را ﺑﺎ ﭘﺴﻮﻧﺪ .matذﺧﻴﺮه ﻣﻲﻛﻨﺪ .در اﻳﻨﺠﺎ
ﭘﺮوﻧﺪه ﺣﺎﺻﻞ از آن ﺑﻪ ﻧﺎم SqueezeTracy.matﻳﻚ ﭘﺮوﻧﺪه از ﻧﺮم اﻓﺰار MATLABﻧﺎﻣﻴﺪه ﻣﻲﺷﻮد .اﻳﻦ ﭘﺮوﻧﺪه ﺣﺎوي دادهﻫﺎي
دودوﻳﻲ و اﺳﺎﻣﻲ ﻣﺘﻐﻴﺮﻫﺎ و ﻣﻘﺎدﻳﺮ ﻣﺤﻴﻂ ﻛﺎر اﺳﺖ .ﻫﻤﭽﻨﻴﻦ ﻣﺘﻐﻴﺮ اﻧﻔﺮادي cرا ﻧﻴﺰ دارد .ﻋﻠﺖ اﺧﺘﻼف اﻧﺪك ﻧﺴﺒﺖ ﻓﺸﺮدهﺳﺎزي cr1, cr2
ﻛﻪ در ﺑﺨﺶ ﻗﺒﻞ ﻣﺤﺎﺳﺒﻪ ﻛﺮدﻳﻢ دادهﻫﺎي ﻣﺘﻔﺮﻗﻪ ﭘﺮوﻧﺪه ﻧﺮم اﻓﺰار MATLABاﺳﺖ.
ﺗﺼﻮﻳﺮﻫﺎي رﻣﺰﮔﺬاري ﺷﺪه ﻫﺎﻓﻤﻦ ﻛﺎرﺑﺮد اﻧﺪﻛﻲ دارﻧﺪ ﻣﮕﺮ آن ﻛﻪ ﺑﺘﻮان آﻧﻬﺎ را دوﺑﺎره ﺑﻪ ﺻﻮرت ﺗﺼﺎوﻳﺮ اﺻﻠﻲ رﻣﺰﮔﺸﺎﻳﻲ ﻛﺮد .اﮔﺮ
y=mat2huff xدر دادهﻫﺎي ﺧﺮوﺟﻲ ﺑﺨﺶ ﻗﺒﻞ ﺑﺎﺷﺪ ،اﺑﺘﺪا رﻣﺰﮔﺸﺎ ﺑﺎﻳﺪ رﻣﺰي را ﻛﻪ در ﻫﺎﻓﻤﻦ ﺑﺮاي رﻣﺰﮔﺸﺎﻳﻲ xﺑﻪ ﻛﺎر ﻣﻲرود ﺑﺎز ﻛﻨﺪ
)ﻛﻪ اﻳﻦ ﻛﺎر ﺑﺮ اﺳﺎس ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎ ) ( histogramو اﻃﻼﻋﺎت اﻳﻜﺲ اﻧﺠﺎم ﻣﻲﺷﻮد( و ﺳﭙﺲ دادهﻫﺎي رﻣﺰﮔﺬاري ﺷﺪه را ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس
ﺗﺮﺳﻴﻢ ﻛﻨﺪ )ﻛﻪ آﻧﻬﺎ ﺑﺮاي ﺑﺎزﺳﺎزي xاز yاﺳﺘﺨﺮاج ﻣﻲﺷﻮﻧﺪ( .ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﻓﻬﺮﺳﺖ ﺗﺎﺑﻌﻬﺎي ) x=huff2mat(yدﻳﺪه ﻣﻲﺷﻮد ،اﻳﻦ
.1اﺳﺘﺨﺮاج اﺑﻌﺎد m, nو ﺣﺪاﻗﻞ ﻣﻘﺪار ) xminدادهﻫﺎي ﺧﺮوﺟﻲ (xاز ﺳﺎزه دادهﻫﺎي ورودي y
.2ﺑﺮاي ﺑﺎزﺳﺎزي رﻣﺰ ﻫﺎﻓﻤﻨﻲ ﻛﻪ ﺑﺮاي رﻣﺰﮔﺬاري xﺑﻪ ﻛﺎر رﻓﺘﻪ اﺳﺖ ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎي آن را ﺑﻪ ﺗﺎﺑﻊ ﻫﺎﻓﻤﻦ ﺑﺪﻫﻴﺪ .رﻣﺰ ﺗﻮﻟﻴﺪ ﺷﺪه در ﻓﻬﺮﺳﺖ
.3ﺳﺎﺧﺘﺎر اﻃﻼﻋﺎﺗﻲ ﺟﺪوﻟﻬﺎي دادهﻫﺎ و اﻧﺘﻘﺎل را اﻳﺠﺎد ﻛﻨﻴﺪ ﺗﺎ ﺑﺎ ﻳﻚ ﺳﺮي ﺟﺴﺘﺠﻮﻫﺎي دودوﻳﻲ ﻛﺎرآﻣﺪ راﻳﺎﻧﻪاي رﻣﺰﮔﺸﺎﻳﻲ دادهﻫﺎي
.4دادهﻫﺎي رﻣﺰﮔﺬاري ﺷﺪه و ﺳﺎﺧﺘﺎر ﻣﺮﺑﻮﻃﻪ را ﺑﻪ ﺗﺎﺑﻊ cﺑﻪ ﻧﺎم unravelﻣﻨﺘﻘﻞ ﻛﻨﻴﺪ .اﻳﻦ ﺗﺎﺑﻊ زﻣﺎن ﻣﻮرد ﻧﻴﺎز ﺑﺮاي اﺟﺮاي ﺟﺴﺘﺠﻮﻫﺎي
دودوﻳﻲ را ﻛﻤﻴﻨﻪ ﻣﻲﻛﻨﺪ و ﺑﺮدار رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه دادهﻫﺎي xرا ﻛﻪ از ﻧﻮع doubleﻳﺎ ﻣﻀﺎﻋﻒ اﺳﺖ اﻳﺠﺎد ﻣﻲﻛﻨﺪ.
xmin .5را ﺑﻪ ﻫﺮ ﻋﻨﺼﺮ اﻳﻜﺲ اﺿﺎﻓﻪ ﻛﻨﻴﺪ و ﺷﻜﻞ آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﺗﺎ ﻣﻄﺎﺑﻖ ﺑﺎ اﺑﻌﺎد xاﺻﻠﻲ ﺷﻮد )ﻳﻌﻨﻲ mﻋﺪد ردﻳﻒ و nﻋﺪد ﺳﺘﻮن(
20
ﻣﺮاﺟﻌﻪ4 اﺳﺖ )ﺑﻪ ﻣﺮﺣﻠﻪunravel ﺑﻪ ﻧﺎمMATLAB ﻧﺮم اﻓﺰارc ادﻏﺎم ﻳﻜﻲ از ﺗﺎﺑﻌﻬﺎيhuff2mat ﻳﻜﻲ از ﺧﺼﻮﺻﻴﺎت ﻣﻨﺤﺼﺮ ﺑﻪ ﻓﺮد
.ﻛﻨﻴﺪ( ﻛﻪ ﺑﺎﻋﺚ ﻣﻲﺷﻮد رﻣﺰﮔﺸﺎﻳﻲ ﺗﺼﻮﻳﺮﻫﺎﻳﻲ ﺑﺎ ﺗﻔﻜﻴﻚ ﭘﺬﻳﺮي ﻋﺎدي ﻓﻮري اﻧﺠﺎم ﺷﻮد
function x= huff2mat(y)
%HUFF2MAT decodes a Huffman encoded matrix.
% X = H UFF2MAT(Y) decodes a Huffman encoded structure Y with uint16
% fields:
% Y.min Minimum values of X plus 32768
% Y.size Size of X
% Y.hist Histogram of X
% Y.code Huffman code
%
% The output X is of class double.
%
% See also MAT2HUFF.
21
ﻫﻤﺎن ﻃﻮر ﻛﻪ ﻗﺒﻼً ﮔﻔﺘﻴﻢ ،رﻣﺰﮔﺸﺎﻳﻲ ﺑﺮ اﺳﺎس huff2matﻣﺒﺘﻨﻲ ﺑﺮ ﺟﺴﺘﺠﻮﻫﺎي دودوﻳﻲ و ﻳﺎ ﺗﺼﻤﻴﻢ ﺑﻪ رﻣﺰﮔﺸﺎﻳﻲ ﺑﺮ اﺳﺎس ﻧﺘﺎﻳﺞ دوﮔﺎﻧﻪ
اﺳﺖ.
ﻫﺮ ﻋﻨﺼﺮ از رﺷﺘﻪ رﻣﺰﮔﺬاري ﺷﺪه ﻫﺎﻓﻤﻦ ﻛﻪ ﺑﻪ ﺗﺮﺗﻴﺐ ﺑﺮرﺳﻲ ﻣﻲﺷﻮد ﻛﻪ اﻟﺒﺘﻪ ﺑﺎﻳﺪ 0ﻳﺎ 1ﺑﺎﺷﺪ ﺑﺎﻋﺚ راه اﻧﺪازي روﻧﺪ رﻣﺰﮔﺸﺎﻳﻲ دودوﻳﻲ
ﺑﺮ اﺳﺎس ﺟﺪول دادهﻫﺎي ﺧﺮوﺟﻲ و اﻧﺘﻘﺎل ﻣﻲﺷﻮد .ﻫﺮ ﻳﻚ از ﻋﻨﺎﺻﺮ اراﻳﻪ linkﺳﻪ ﺣﺎﻟﺘﻪ ﻣﻄﺎﺑﻖ ﺑﺎ رﺷﺘﻪﻫﺎي دودوﻳﻲ رﻣﺰﮔﺬاري ﺷﺪه
ﻫﺎﻓﻤﻦ در آراﻳﻪ ﺳﻠﻮﻟﻲ ﻣﻄﺎﺑﻖ ﺑﺎ آﻧﻬﺎ ﻫﺴﺘﻨﺪ .در اﺑﺘﺪا ))’ code=cellstr(char(‘’,’0’, ‘1اﺳﺖ رﺷﺘﻪ ﺗﻬﻲ ﻛﺪ ) (1ﻧﻘﻄﻪ ﻣﺒﺪاء )و ﻳﺎ
ﺣﺎﻟﺖ رﻣﺰﮔﺸﺎﻳﻲ ﻣﻘﺪﻣﺎﺗﻲ( اﺳﺖ ﻛﻪ در ﻫﻤﻪ رﻣﺰﮔﺸﺎﻳﻴﻬﺎي رﺷﺘﻪ ﻫﺎﻓﻤﻦ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد .ﻋﺪد 2در ﭘﻴﻮﻧﺪ )،(1دو ﺣﺎﻟﺖ رﻣﺰﮔﺸﺎي
ﻣﺤﺘﻤﻞ را ﺷﻨﺎﺳﺎﻳﻲ ﻣﻲﻛﻨﺪ ﻛﻪ 0ﻳﺎ 1را ﺑﻪ رﺷﺘﻪ ﺗﻬﻲ ﻣﺘﺼﻞ ﻣﻲﻛﻨﻨﺪ .اﮔﺮ ﺑﻴﺖ رﻣﺰﮔﺬاري ﺷﺪه ﺑﻌﺪي ﻫﺎﻓﻤﻦ ﺻﻔﺮ ﺑﺎﺷﺪ ،ﺣﺎﻟﺖ رﻣﺰﮔﺸﺎي
ﺑﻌﺪ ) link(2اﺳﺖ )از آﻧﺠﺎﺋﻲ ﻛﻪ code(2)=0اﺳﺖ رﺷﺘﻪ ﺗﻬﻲ ﺑﺎ ﺻﻔﺮ ارﺗﺒﺎط دارد( .اﮔﺮ 1ﺑﺎﺷﺪ ﺣﺎﻟﺖ ﺟﺪﻳﺪ ) link(3ﻣﻲﺷﻮد .ﺗﻮﺟﻪ
داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ وروديﻫﺎي آراﻳﻪ ﭘﻴﻮﻧﺪ ﺻﻔﺮ ﻫﺴﺘﻨﺪ ﻳﻌﻨﻲ ﻃﻮري ﭘﺮدازش ﻧﺸﺪهاﻧﺪ ﻛﻪ ﻧﻤﺎﻳﺎﻧﮕﺮ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﺻﺤﻴﺢ در ﺗﺮﺳﻴﻢ رﻣﺰ ﻫﺎﻓﻤﻦ
ﺑﺎﺷﻨﺪ .در ﺣﻴﻦ ﺳﺎﺧﺖ اﻳﻦ ﭘﻴﻮﻧﺪ اﮔﺮ ﻫﺮ ﻳﻚ از رﺷﺘﻪﻫﺎي 0ﻳﺎ 1در ﻧﻘﺸﻪ ﻳﺎﻓﺖ ﺷﻮد) ،ﻳﻌﻨﻲ ﻳﻚ رﻣﺰ ﻣﻌﺘﺒﺮ ﻫﺎﻓﻤﻦ ﺑﺎﺷﺪ( ﺻﻔﺮ ﻣﻨﻄﺒﻖ ﺑﺎ آن
در ﭘﻴﻮﻧﺪ ﺟﺎﻳﮕﺰﻳﻦ ﻣﻘﺪار ﻣﻨﻔﻲ ﺷﺎﺧﺺ ﻧﻘﺸﻪ ﻣﻄﺎﺑﻖ ﺑﺎ آن ﻣﻲﺷﻮد )ﻛﻪ ﻫﻤﺎن ﻣﻘﺪار رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه اﺳﺖ( .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻳﻚ ﭘﻴﻮﻧﺪ
ﺟﺪﻳﺪ ﺑﺎ ﻣﻘﺪار ﻣﺜﺒﺖ درج ﻣﻲﺷﻮد ﺗﺎ اﺷﺎره ﺑﻪ 2ﺣﺎﻟﺖ ﺟﺪﻳﺪ داﺷﺘﻪ ﺑﺎﺷﺪ) .ﻛﻪ اﻳﻨﻬﺎ رﻣﺰﻫﺎي ﻣﺤﺘﻤﻞ ﻫﺎﻓﻤﻦ ﻫﺴﺘﻨﺪ( ﻛﻪ ﻣﻨﻄﻘﺎٌ ﻳﺎ ﺑﺮ اﺳﺎس
اﻳﻦ ﻋﻨﺎﺻﺮ ﭘﻴﻮﻧﺪي ﭘﺮدازش ﻧﺸﺪه ﺟﺪﻳﺪ linkرا اﻓﺰاﻳﺶ ﻣﻲدﻫﻨﺪ )رﻣﺰ آراﻳﻪ ﺳﻠﻮل ﻧﻴﺰ ﺑﺎﻳﺪ updateﺷﻮد( ﻓﺮاﻳﻨﺪ ﺳﺎﺧﺖ آﻧﻘﺪر اداﻣﻪ ﻣﻲﺑﺎد
ﻛﻪ دﻳﮕﺮ ﻫﻴﭻ ﻋﻨﺼﺮ ﭘﺮدازش ﻧﺸﺪهاي در linkﺑﺎﻗﻲ ﻧﻤﺎﻧﺪ .ﺑﻪ ﺟﺎي ﺑﺮرﺳﻲ ﻣﺴﺘﻤﺮ ﻋﻨﺎﺻﺮ ﭘﺮدازش ﻧﺸﺪه در اﻳﻦ ﭘﻴﻮﻧﺪ huff2matﻳﻚ اراﻳﻪ
ردﻳﺎﺑﻲ ﺑﻪ ﻧﺎم leftدارد ﻛﻪ ﺑﺎ 2و 3راه اﻧﺪازي ﻣﻲﺷﻮد و ﺑﻪ ﻫﻨﮕﺎم ﺳﺎزي) (updateﻣﻲﺷﻮد ﺗﺎ ﺷﺎﺧﺼﻬﺎي ﻋﻨﺎﺻﺮ ﭘﻴﻮﻧﺪي ﺑﺮرﺳﻲ ﻧﺸﺪه را
ﻧﻴﺰ در ﺑﺮ ﺑﮕﻴﺮد.
ﺟﺪول 6.3ﺟﺪول اﻳﻦ ﭘﻴﻮﻧﺪ اﺳﺖ ﻛﻪ ﺑﺮاي رﻣﺰ ﻫﺎﻓﻤﻦ در ﻣﺜﺎل 6.2اﻳﺠﺎد ﺷﺪه اﺳﺖ .اﮔﺮ ﻫﺮ ﺷﺎﺧﺺ ﭘﻴﻮﻧﺪ ﻳﻚ ﺣﺎﻟﺖ رﻣﺰﮔﺸﺎي Iﻣﺤﺴﻮب
ﺷﻮد ،ﻫﺮ ﻳﻚ از رﻣﺰﮔﺬاريﻫﺎي دودوﻳﻲ )در ﺑﺮرﺳﻲ رﺷﺘﻪ رﻣﺰﮔﺬاري ﺷﺪه از ﭼﭗ ﺑﻪ راﺳﺖ( و ﻳﺎ دادهﻫﺎي ﺧﺮوﺟﻲ رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه ﻫﺎﻓﻤﻦ ﺑﺎ
.1اﮔﺮ link (i)<0ﺑﺎﺷﺪ )ﻳﻌﻨﻲ ﻣﻨﻔﻲ ﺑﺎﺷﺪ( ﻳﻜﻲ از ﻛﻠﻤﺎت رﻣﺰ ﻫﺎﻓﻤﻦ رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه اﺳﺖ .در اﻳﻨﺠﺎ ) link(iداده ﺧﺮوﺟﻲ رﻣﺰﮔﺸﺎﻳﻲ
.2اﮔﺮ link(i) >0ﺑﺎﺷﺪ) ،ﻳﻌﻨﻲ ﻣﺜﺒﺖ ﺑﺎﺷﺪ( و ﺑﻴﺖ رﻣﺰﮔﺬاري ﺷﺪه ﺑﻌﺪي 0ﺑﺎﺷﺪ ﺣﺎﻟﺖ رﻣﺰﮔﺸﺎﻳﻲ ﺑﻌﺪي ﺷﺎﺧﺺ link iاﺳﺖ ﻳﻌﻨﻲ
22
.3اﮔﺮ link(i) >0ﺑﺎﺷﺪ و ﺑﻴﺖ رﻣﺰي ﺷﺪه ﺑﻌﺪي 1ﺑﺎﺷﺪ ﺣﺎﻟﺖ رﻣﺰﮔﺸﺎﻳﻲ ﺑﻌﺪي ﺷﺎﺧﺺ link(i) +1اﺳﺖ ﻳﻌﻨﻲ i = link(i) + 1
ﻫﻤﺎن ﻃﻮر ﻛﻪ ﻗﺒﻼً ﮔﻔﺘﻴﻢ وروديﻫﺎي ﭘﻴﻮﻧﺪﻫﺎي ﻣﺜﺒﺖ ﻣﻄﺎﺑﻖ ﺑﺎ رﻣﺰﮔﺸﺎﻳﻲﻫﺎي اﻧﺘﻘﺎﻟﻲ دودوﻳﻲ ﻫﺴﺘﻨﺪ در ﺣﺎﻟﻲ ﻛﻪ وروديﻫﺎي ﻣﻨﻔﻲ
ﻣﻘﺎدﻳﺮ رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه دادهﻫﺎي ﺧﺮوﺟﻲ را ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﻨﺪ .ﺑﻌﺪ از رﻣﺰﮔﺸﺎﻳﻲ ﻫﺮ ﻳﻚ از ﻛﺪﻫﺎي ﻫﺎﻓﻤﻦ ﻳﻚ ﺟﺴﺘﺠﻮي دودوﻳﻲ در ﺷﺎﺧﺺ
linkآﻏﺎز ﻣﻲﺷﻮد ﻛﻪ ﺗﻮاﻟﻲ اﻧﺘﻘﺎل ﺣﺎﻟﺖ ﺣﺎﺻﻞ از آن ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ i=1,3,1,2,5,6,1,…:ﺗﻮاﻟﻲ دادهﻫﺎي ﺧﺮوﺟﻲ ﻣﻄﺎﺑﻖ ﺑﺎ آن
_,|_2|,_,_,_,|_3|,_,_,..اﺳﺖ .ﺧﻂ ﻓﺎﺻﻠﻪ ﻧﻤﺎﻳﺎﻧﮕﺮ ﻧﺒﻮد دادهﻫﺎي ﺧﺮوﺟﻲ اﺳﺖ .دادهﻫﺎي ﺧﺮوﺟﻲ رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه 2و 3ﭘﻴﻜﺴﻞ اول
ﺗﺎﺑﻊ unravelزﺑﺎن Cﺳﺎزه ﻓﻮق را ﻗﺒﻮل ﻣﻲﻛﻨﺪ و از آن ﺑﺮاي ﺟﺴﺘﺠﻮي دودوﻳﻲ ﺑﺮاي رﻣﺰﮔﺸﺎﻳﻲ دادهﻫﺎي ورودي hxاﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ.
ﻋﻤﻠﻜﺮد اﺳﺎﺳﻲ آن در ﻧﻤﻮدار 6.5ﺗﺮﺳﻴﻢ ﺷﺪه اﺳﺖ ﻛﻪ ﻣﻄﺎﺑﻖ ﺑﺎ ﻓﺮاﻳﻨﺪ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﺗﺸﺮﻳﺢ ﺷﺪه در ﺟﺪول 6.3اﺳﺖ .ﺗﻐﻴﻴﺮاﺗﻲ اﻧﺠﺎم ﺷﺪه
ﻣﻲﺗﻮان ﺗﺎﺑﻌﻬﺎي زﺑﺎن Cو Fortranرا در ﻧﺮم اﻓﺰار Matlabادﻏﺎم ﻛﺮد ﺗﺎ ﺑﻪ دو ﻫﺪف دﺳﺖ ﻳﺎﻓﺖ:
) (1ﻣﻲﺗﻮان ﺑﺮﻧﺎﻣﻪﻫﺎي Fortranو Cرا ﺑﺪون ﻧﻴﺎز ﺑﻪ ﺑﺎزﻧﻮﻳﺴﻲ آﻧﻬﺎ ﺑﻪ ﺻﻮرت ﭘﺮوﻧﺪهﻫﺎي Mاز ﻧﺮم اﻓﺰار MATLABﻓﺮاﺧﻮاﻧﻲ ﻛﺮد.
) (2آﻧﻬﺎ ﺑﺎﻋﺚ ﺗﺴﺮﻳﻊ ﻣﺤﺎﺳﺒﻪ ﺑﺮﺧﻲ ﭘﺮوﻧﺪهﻫﺎي Mﻧﺮم اﻓﺰار MATLABﻣﻲﺷﻮﻧﺪ ﻛﻪ ﻣﻌﻤﻮﻻً ﺑﺎ ﺳﺮﻋﺖ ﻛﺎﻓﻲ اﻧﺠﺎم ﻧﻤﻲﺷﻮﻧﺪ وﻟﻲ
ﻣﻲﺗﻮان ﺑﺮاي اﻓﺰاﻳﺶ ﻛﺎرآﻳﻲ آﻧﻬﺎ را در Cﻳﺎ Fortranرﻣﺰﮔﺬاري ﻛﺮد .ﺻﺮف ﻧﻈﺮ از اﺳﺘﻔﺎده از Cﻳﺎ Fortranﺗﺎﺑﻊﻫﺎي ﺣﺎﺻﻞ از آن را
ﭘﺮوﻧﺪهﻫﺎي MEXﻣﻲﻧﺎﻣﻴﻢ .رﻓﺘﺎر آﻧﻬﺎ ﻃﻮري اﺳﺖ ﻛﻪ ﮔﻮﻳﻲ ﭘﺮوﻧﺪهﻫﺎي Mﻳﺎ ﺗﺎﺑﻌﻬﺎي ﻋﺎدي ﻧﺮم اﻓﺰار MATLABﻫﺴﺘﻨﺪ .وﻟﻲ ﺑﺮ
ﺧﻼف ﭘﺮوﻧﺪهﻫﺎي Mآﻧﻬﺎ را ﺑﺎﻳﺪ ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ ﺑﺎ اﺳﺘﻔﺎده از ﭘﺮوﻧﺪه آﻏﺎزﮔﺮ MEXدر ﻧﺮم اﻓﺰار MATLABﺗﺪوﻳﻦ و ﻣﺮﺗﺒﻂ ﻛﺮد .ﻣﺜﻼً
ﺑﺮاي ﺗﺒﺪﻳﻞ و ﭘﻴﻮﻧﺪ ﺗﺎﺑﻊ unravelدر ﻣﺤﻴﻂ وﻳﻨﺪوز ﻋﺒﺎرت زﻳﺮ در ﺧﻂ ﻓﺮﻣﺎن ﻧﺮم اﻓﺰار Matlabﺑﺎﻳﺪ ﻧﻮﺷﺘﻪ ﺷﻮد:
23
>> mex unravel.c
ﺟﺪاﮔﺎﻧﻪ ﺑﺎ ﻫﻤﺎنM ﻫﺮ ﻧﻮع ﻣﺘﻦ راﻫﻨﻤﺎ ﺑﻪ ﺻﻮرت ﻳﻚ ﭘﺮوﻧﺪه. اﻳﺠﺎد ﻣﻲﺷﻮدdll ﺑﺎ ﭘﺴﻮﻧﺪunravel.dll ﺑﻪ ﻧﺎمMEX ﺳﭙﺲ ﻳﻚ ﭘﺮوﻧﺪه
: دارد و ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ.c ﭘﺴﻮﻧﺪunravel ﺑﻪ ﻧﺎمC MEX ﻛﺪ ﻣﻨﺒﻊ ﭘﺮوﻧﺪه
Unravel.c
ﺑﻴﺘﻲ اﺳﺖ( و روﻧﺪ ﻣﺮﺗﺐ ﺳﺎزي آن دودوﻳﻲ16 ﻛﻪ ﻳﻚ رﺷﺘﻪ ﺑﻪ ﻃﻮل ﻣﺘﻐﻴﺮ رﻣﺰﮔﺬاري ﺷﺪه را رﻣﺰﮔﺸﺎﻳﻲ ﻣﻲﻛﻨﺪ )و ﺑﺮداري ﺑﺎ اﻋﺪاد ﺻﺤﻴﺢ
24
/* Is last input argument a scalar? */
if (!mxIsDouble(prhs[2]) || mxIsComplex(prhs[2]) ||
mxGetN(prhs[2]) * mxGetM(prhs[2]) != 1)
mexErrMsgTxt("Input XSIZE must be a scalar.");
/* Create input matrix pointers and get scalar */
hx = mxGetPr(prhs[0]); /* UINT16 */
link = mxGetPr(prhs[1]); /* DOUBLE */
xsz = mxGetScalat(prhs[2]); /* DOUBLE */
از دو ﺑﺨﺶ ﻣﺘﻤﺎﻳﺰ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ ﻛﻪ آﻧﻬﺎ را روال ﻣﺤﺎﺳﺒﺎﺗﻲ وC MEX ﻫﻤﭽﻮن ﺳﺎﻳﺮ ﭘﺮوﻧﺪهﻫﺎيunravel.c ٫C MEX ﭘﺮوﻧﺪه
.دروازه ﻣﻲﻧﺎﻣﻴﻢ
. را اﺟﺮا ﻣﻲﻛﻨﺪ6.5 اﺳﺖ ﻛﻪ ﻓﺮاﻳﻨﺪ رﻣﺰﮔﺸﺎﻳﻲ ﺗﺼﻮﻳﺮC روال ﻣﺤﺎﺳﺒﺎﺗﻲ ﻛﻪ آن را روال ﮔﺮهﮔﺸﺎ ﻧﻴﺰ ﻣﻲﻧﺎﻣﻴﻢ ﺣﺎوي رﻣﺰ
ارﺗﺒﺎطhuff2mat ﻓﺮاﺧﻮان ﺗﺎﺑﻊM و ﭘﺮوﻧﺪهc درunravel اﺳﺖ ﻛﻪ ﺑﻴﻦ روال ﻣﺤﺎﺳﺒﺎﺗﻲMexFunction ﻧﺎم ﻫﻤﻴﺸﮕﻲ روال دروازه
اﻳﺠﺎد ﻣﻲﻛﻨﺪ
: اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ ﻛﻪ ﺑﺮ اﺳﺎس ﻣﻮارد زﻳﺮ اﺳﺖMATLAB ﻧﺮم اﻓﺰارMex از ﻣﻴﺎﻧﺠﻲ اﺳﺘﺎﻧﺪارد ﭘﺮوﻧﺪه
25
.1ﭼﻬﺎر ﭘﺎراﻣﺘﺮ اﺳﺘﺎﻧﺪارد از دادهﻫﺎي ورودي و ﺧﺮوﺟﻲ:
اﻳﻦ ﭘﺎراﻣﺘﺮﻫﺎ ﺷﻤﺎره ﺷﻨﺎﺳﻪﻫﺎي ﺳﻤﺖ ﭼﭗ دادهﻫﺎي ﺧﺮوﺟﻲ )ﻋﺪد ﺻﺤﻴﺢ( ،و آراﻳﻪاي از اﺷﺎرهﮔﺮﻫﺎي ﺳﻤﺖ ﭼﭗ ﺷﻨﺎﺳﻪﻫﺎي دادهﻫﺎي
ﺧﺮوﺟﻲ )ﻛﻪ ﻫﻤﮕﻲ آراﻳﻪﻫﺎي ﻧﺮم اﻓﺰار MATLABﻫﺴﺘﻨﺪ( ﻣﻲﺑﺎﺷﻨﺪ .ﺗﻌﺪاد ﺷﻨﺎﺳﻪﻫﺎي دادهﻫﺎي ورودي ﺳﻤﺖ راﺳﺖ )ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ
دﻳﮕﺮ( ،و آراﻳﻪ اﺷﺎرهﮔﺮﻫﺎي ﺷﻨﺎﺳﻪﻫﺎي دادهﻫﺎي ورودي ﺳﻤﺖ راﺳﺖ )ﻫﻤﮕﻲ آراﻳﻪﻫﺎي ﻧﺮم اﻓﺰار MATLABﻫﺴﺘﻨﺪ(
.2ﻣﺠﻤﻮﻋﻪاي از ﺗﺎﺑﻌﻬﺎي ﻣﻴﺎﻧﺠﻲ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﺎرﺑﺮدي ﻛﻪ در ﻧﺮم اﻓﺰار Matlabﺗﻬﻴﻪ ﺷﺪه اﺳﺖ .اﻳﻦ ﺗﺎﺑﻌﻬﺎ ﻛﻪ ﭘﺴﻮﻧﺪ mxدارﻧﺪ ﺑﺮاي اﻳﺠﺎد،
دﺳﺘﺮﺳﻲ ﺑﻪ ،ﻣﺪﻳﺮﻳﺖ ،و ﻳﺎ ﺗﺨﺮﻳﺐ ﺳﺎﺧﺘﺎر آراﻳﻪﻫﺎي ﻧﻮع mxﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮﻧﺪ .ﻣﺜﻼً
mxCallocدادهﻫﺎي ﺣﺎﻓﻈﻪ را ﻫﻤﭽﻮن ﻳﻚ ﺗﺎﺑﻊ اﺳﺘﺎﻧﺪارد C Callocﺑﻪ ﺷﻜﻞ ﭘﻮﻳﺎ ﺗﺨﺼﻴﺺ ﻣﻲدﻫﺪ .ﺗﺎﺑﻌﻬﺎي ﻣﺮﺗﺒﻂ mxMalloc,
mxGetScalarﻛﻤﻴﺖ ﻋﺪدي را از دادهﻫﺎي ورودي آراﻳﻪ prhsاﺳﺘﺨﺮاج ﻣﻲﻛﻨﺪ .ﺳﺎﻳﺮ ﺗﺎﺑﻌﻬﺎي mxGetﻣﺎﻧﻨﺪ mxGetM, mxGetn,
ﺗﺎﺑﻌﻬﺎي ﻣﻴﺎﻧﺠﻲ ﺑﺎ ﭘﺴﻮﻧﺪ mexﻋﻤﻠﻴﺎﺗﻲ را در ﻣﺤﻴﻂ ﻧﺮم اﻓﺰار MATLABاﻧﺠﺎم ﻣﻲدﻫﻨﺪ .ﻣﺜﻼً mexErrMsgTxtﻳﻚ ﭘﻴﺎم را در
ﻛﻪ در ﺑﺨﺶ 2ﻓﻬﺮﺳﺖ ﻗﺒﻞ ﺑﻪ آﻧﻬﺎ اﺷﺎره ﺷﺪ در ﭘﺮوﻧﺪهﻫﺎي ﺳﺮﻧﻮﻳﺲ ﻧﺮم اﻓﺰار MATLABﺑﺎ ﺗﺎﺑﻌﻬﺎي اﺻﻠﻲ ﻣﻴﺎﻧﺠﻲ mx٫ mex
اﺳﺎﻣﻲ mex.h, matrix.hﻫﺴﺘﻨﺪ .ﻫﺮ دو در ﻣﺴﻴﺮ ﺑﻴﺮوﻧﻲ ﻧﺼﺐ ﻧﺮم اﻓﺰار MATLABﻫﺴﺘﻨﺪ <matlab> .رﻳﺸﻪ دراﻳﻮي اﺳﺖ ﻛﻪ ﻧﺮم
ﺳﺮﻧﻮﻳﺲ mex.hﺑﺎﻳﺪ در آﻏﺎز ﻫﻤﻪ ﭘﺮوﻧﺪهﻫﺎي mexدرج ﺷﻮد) .ﺑﻪ ﻋﺒﺎرت درج ﭘﺮوﻧﺪه #include “mex.h” cﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ داراي
ﻧﻤﻮﻧﻪﻫﺎي اﺻﻠﻲ رواﻟﻬﺎي ﻣﻴﺎﻧﺠﻲ mex, mxﻛﻪ در اﻳﻦ ﭘﺮوﻧﺪهﻫﺎ درج ﺷﺪه اﺳﺖ ﭘﺎراﻣﺘﺮﻫﺎي ﻣﻮرد اﺳﺘﻔﺎده را ﺗﻌﺮﻳﻒ ﻣﻲﻛﻨﻨﺪ و ﻧﺸﺎﻧﻪﻫﺎي
ارزﺷﻤﻨﺪ ي درﺑﺎره ﻋﻤﻠﻴﺎت ﻛﻠﻲ آﻧﻬﺎ دارﻧﺪ .ﺳﺎﻳﺮ اﻃﻼﻋﺎت دردﻓﺘﺮﭼﻪ راﻫﻨﻤﺎي ﻣﻴﺎﻧﺠﻲﻫﺎي ﺑﻴﺮوﻧﻲ ﻧﺮم اﻓﺰار MATLAB )MATLAB
ﺑﺤﺚ ﻗﺒﻞ در ﺗﺼﻮﻳﺮ 6.6ﺧﻼﺻﻪ ﺷﺪه اﺳﺖ و داراي ﺟﺰﺋﻴﺎت ﺳﺎﺧﺘﺎر ﭘﺮوﻧﺪهﻫﺎي c mexاﺳﺖ و ﺟﺮﻳﺎن اﻃﻼﻋﺎت را ﺑﻴﻦ آﻧﻬﺎ و ﭘﺮوﻧﺪه M
huff2matﻧﺸﺎن ﻣﻲدﻫﺪ .ﮔﺮﭼﻪ ﺑﺮ اﺳﺎس رﻣﺰﮔﺸﺎﻳﻲ ﻫﺎﻓﻤﻦ اﻳﺠﺎد ﺷﺪه اﺳﺖ ،وﻟﻲ ﻣﻄﺎﻟﺐ آن را ﻣﻲﺗﻮان ﺑﻪ راﺣﺘﻲ ﺑﻪ ﺳﺎﻳﺮ ﺗﺎﺑﻌﻬﺎي
26
.
ﺗﺼﻮﻳﺮ :6.6ﻛﻨﺶ و واﻛﻨﺶ ﭘﺮوﻧﺪه mhuff2matو ﺗﺎﺑﻊ unravelﻓﺮاﺧﻮانﭘﺬﻳﺮ در ﻧﺮم اﻓﺰار MATLABﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ c
2 mex file unravelﻛﺎرﺑﺮد دارد :ﺑﻪ ﻋﻨﻮان روال دروازه mex functionو روال ﻣﺤﺎﺳﺒﺎﺗﻲ unravelﻣﺘﻦ راﻫﻨﻤﺎ در ﭘﺮوﻧﺪه دﻳﮕﺮي ﺑﻪ
ﻧﺎم unravelاﺳﺖ.
27
ﺗﺼﻮﻳﺮ رﻣﺰﮔﺬاري ﺷﺪه ﻫﺎﻓﻤﻦ در ﻣﺜﺎل 6.3را ﻣﻲﺗﻮان ﺑﺎ ﺗﻮاﻟﻲ ﻓﺮﻣﺎﻧﻬﺎي زﻳﺮ رﻣﺰﮔﺸﺎﻳﻲ ﻛﺮد:
ﺗﺎﺑﻊ load fileﻣﺘﻐﻴﺮﻫﺎي MATLABرا از ﭘﺮوﻧﺪهﻫﺎ ﻣﻲﺧﻮاﻧﺪ آﻧﻬﺎ را داﺧﻞ ﻣﺤﻴﻂ ﻛﺎر ﺑﺎرﮔﺬاري ﻣﻲﻛﻨﺪ .اﺳﺎﻣﻲ ﻣﺘﻐﻴﺮﻫﺎ ﺑﻪ ﺗﺮﺗﻴﺐ
ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ در اﻳﻦ ﻓﺮاﻳﻨﺪ رﻣﺰﮔﺬاري و رﻣﺰﮔﺸﺎﻳﻲ اﻃﻼﻋﺎت ﺣﻔﻆ ﻣﻲﺷﻮﻧﺪ .ﺧﻄﺎي ﺟﺬر ﻣﻴﺎﻧﮕﻴﻦ ﻣﺮﺑﻌﺎت ﺑﻴﻦ ﺗﺼﻮﻳﺮﻫﺎي اﺻﻠﻲ و
ﻧﺎﻓﺸﺮده ﺷﺪه ﺻﻔﺮ اﺳﺖ .از آﻧﺠﺎﺋﻲ ﻛﻪ ﺑﻴﺸﺘﺮ رﻣﺰﮔﺸﺎﻳﻲ در ﭘﺮوﻧﺪهﻫﺎي c mexاﻧﺠﺎم ﻣﻲﺷﻮد huff2matاﻧﺪﻛﻲ ﺳﺮﻳﻌﺘﺮ از ﻫﻤﺘﺎي رﻣﺰﮔﺬار
ﺧﻮد اﺳﺖ .ﺑﻪ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ﺑﺎرﮔﻴﺮي) (load functionﺑﺮاي ﺑﻪ دﺳﺖ آوردن دادهﻫﺎي ﺧﺮوﺟﻲ رﻣﺰﮔﺬاري ﺷﺪه در ﻣﺜﺎل 6.3ﺗﻮﺟﻪ ﻛﻨﻴﺪ.
ﺗﺼﺎوﻳﺮ (a).6.7و) (cو (b)6.7و) (dﭘﻴﺸﻴﻨﻪ ﻧﻤﺎﻫﺎي ﻳﻜﺴﺎن دارﻧﺪ .اﻳﻦ ﺳﺎﺑﻘﻪ ﻧﻤﺎه)(histogramا ﺳﻪ ﺣﺎﻟﺘﻪ ﻫﺴﺘﻨﺪ و ﻣﻘﺎدﻳﺮ ﺳﻄﺢ
28
از آﻧﺠﺎﺋﻲ ﻛﻪ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺗﺼﺎوﻳﺮ ﺑﺮاﺑﺮ ﻧﻴﺴﺘﻨﺪ ،رﻣﺰﮔﺬاري ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ ﺑﺮاي ﻛﺎﻫﺶ اﻓﺰوﻧﮕﻲ رﻣﺰﮔﺬاري ﺑﻪ ﻛﺎر ﻣﻲرود ﻛﻪ رﻳﺸﻪ آن
ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ در اﻳﻨﺠﺎ ﺷﺎﺧﺺ درﺟﻪ ﺑﻲﻧﻈﻤﻲ 2ﺗﺼﻮﻳﺮ ﻳﻜﺴﺎن اﺳﺖ و ﺑﺎ mat2huffﺑﻪ ﻃﻮر ﻳﻜﺴﺎن ﻓﺸﺮدهﺳﺎزي ﺷﺪهاﻧﺪ )ﻧﺴﺒﺖ
ﻓﺸﺮدهﺳﺎزي 1.0704ﺑﻪ 1.0821اﺳﺖ( .ﺑﻨﺎ ﺑﺮ اﻳﻦ رﻣﺰﮔﺬاري ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ ﺑﺮاي اﺳﺘﻔﺎده از رواﺑﻂ ﺳﺎﺧﺘﺎري آﺷﻜﺎر ﺑﻴﻦ ﻣﻮارد ﻫﻤﺮاﺳﺘﺎ در
ﺗﺼﻮﻳﺮ (c)6.7ﻧﻴﺴﺖ .ﮔﺮﭼﻪ ارﺗﺒﺎﻃﻬﺎي ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي در اﻳﻦ ﻋﻜﺲ ﻣﺸﺨﺺ اﺳﺖ وﻟﻲ در ﺗﺼﻮﻳﺮ (a)6.7ﻧﻴﺰ دﻳﺪه ﻣﻲﺷﻮﻧﺪ .از آﻧﺠﺎﺋﻲ ﻛﻪ
ﻣﻘﺎدﻳﺮ ﭘﻴﻜﺴﻠﻬﺎي ﻫﺮ ﺗﺼﻮﻳﺮ را ﻣﻲﺗﻮان از ﻣﻘﺎدﻳﺮ ﻣﺠﺎور آﻧﻬﺎ ﭘﻴﺶ ﺑﻴﻨﻲ ﻛﺮد اﻳﻦ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي ﺣﺎﻣﻞ اﻃﻼﻋﺎت اﻧﺪﻛﻲ ﻫﺴﺘﻨﺪ .اﻳﻦ ﭘﻴﻜﺴﻠﻬﺎ
ﺑﺮاي ﻧﻤﺎﻳﺶ ﺗﺼﺎوﻳﺮ اﻃﻼﻋﺎت اﺿﺎﻓﻲ ﻧﻴﺰ دارﻧﺪ ﻛﻪ ﻣﻲﺗﻮان آن را ﺑﺮ اﺳﺎس ﻣﻘﺎدﻳﺮ ﻣﺠﺎور ﺣﺪس زد .اﻳﻦ رواﺑﻂ ﻣﺒﻨﺎي ﺧﺼﻮﺻﻴﺎت اﺿﺎﻓﻲ
ﺑﺮاي ﻛﺎﻫﺶ اﻓﺰوﻧﮕﻲ ﺑﻴﻦ ﭘﻴﻜﺴﻠﻬﺎ اراﻳﻪ ﭘﻴﻜﺴﻞ 2ﺑﻌﺪي ﻛﻪ ﻣﻌﻤﻮﻻً ﺑﺮاي ﻣﺸﺎﻫﺪه ﺑﺎ ﭼﺸﻢ اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﺗﺒﺪﻳﻞ ﺑﻪ ﻗﺎﻟﺒﻲ ﻛﺎرآﻣﺪ ﻣﻲﺷﻮد
ﻛﻪ ﺟﻨﺒﻪ ﺗﺼﻮﻳﺮي ﻧﺪارد .ﻣﺜﻼً اﺧﺘﻼف ﺑﻴﻦ ﻋﻨﺼﺮﻫﺎي ﻣﺠﺎور ﺑﺮاي ﻧﻤﺎﻳﺶ ﺗﺼﻮﻳﺮ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮﻧﺪ .در ﺗﺒﺪﻳﻠﻬﺎﻳﻲ از اﻳﻦ ﻧﻮع )ﻛﻪ اﻓﺰوﻧﮕﻲ
ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي ﺑﺮﻃﺮف ﻣﻲﺷﻮد( ﻧﻘﺸﻪ ﺑﺮداري ﻧﺎﻣﻴﺪه ﻣﻲﺷﻮﻧﺪ .اﮔﺮ ﺑﺘﻮان ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮ اﺻﻠﻲ را ﺑﺎ دادهﻫﺎي ﺗﺒﺪﻳﻞ ﺷﺪه ﺑﺎزﺳﺎزي ﻛﺮد
ﻳﻚ روش ﻧﻘﺸﻪ ﺑﺮداري ﺳﺎده در ﺗﺼﻮﻳﺮ 6.8ﻧﺸﺎن داده ﺷﺪه اﺳﺖ .ﻧﺎم اﻳﻦ روش ﭘﻴﺶ ﺑﻴﻨﻲ رﻣﺰﮔﺬاري ﺑﺪون ﺧﺴﺎرت) lossless
(predictive codingاﺳﺖ .ﺑﺮاي ﺣﺬف اﻓﺰوﻧﮕﻲ ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي ﻣﺠﺎور ،اﻃﻼﻋﺎت ﺟﺪﻳﺪ ﻫﺮ ﻋﻨﺼﺮ اﺳﺘﺨﺮاج و رﻣﺰﮔﺬاري ﻣﻲﺷﻮد.
اﻃﻼﻋﺎت ﺟﺪﻳﺪ ﻫﺮ ﻋﻨﺼﺮ ﺗﺼﻮﻳﺮي ﺗﻔﺎوت ﺑﻴﻦ ﻣﻘﺪار واﻗﻌﻲ و ﭘﻴﺶ ﺑﻴﻨﻲ ﺷﺪه آن ﻋﻨﺼﺮ اﺳﺖ .ﻫﻤﺎن ﻃﻮر ﻛﻪ دﻳﺪه ﻣﻲﺷﻮد اﻳﻦ ﺳﻴﺴﺘﻢ از ﻳﻚ
29
ﻛﻪ ﻫﺮ ﻛﺪام از آﻧﻬﺎ ﻳﻚ ﭘﻴﺶﺑﻴﻨﻲ ﻛﻨﻨﺪه ﻳﻜﺴﺎن دارد .وﻗﺘﻲ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي ﺑﻪ ﺻﻮرت ﭘﻲدرﭘﻲ ﺑﻪ ﻧﺎم fnﺑﻪ رﻣﺰﮔﺬار داده ﻣﻲﺷﻮﻧﺪ اﺑﺰار ﭘﻴﺶ
ﺑﻴﻨﻲ ﻛﻨﻨﺪه ﻣﻘﺪار ﻗﺎﺑﻞ ﭘﻴﺶ ﺑﻴﻨﻲ آن ﻋﻨﺼﺮ ﺗﺼﻮﻳﺮي را ﺑﺮ اﺳﺎس ﻣﻘﺎدﻳﺮ دادهﻫﺎي ورودي ﻗﺒﻠﻲ ﺗﻌﻴﻴﻦ ﻣﻲﻛﻨﺪ .ﺳﭙﺲ دادهﻫﺎي ﺧﺮوﺟﻲ
ﭘﻴﺶﺑﻴﻨﻲ ﻛﻨﻨﺪه ﺑﻪ ﻧﺰدﻳﻜﺘﺮﻳﻦ ﻋﺪد ﺻﺤﻴﺢ ﮔﺮد ﻣﻲﺷﻮﻧﺪ ﺗﺎ fnرا ﺗﺸﻜﻴﻞ دﻫﻨﺪ و اﺧﺘﻼف ﻳﺎ ﺧﻄﺎي ﭘﻴﺶﺑﻴﻨﻲ را اﻳﺠﺎد ﻣﻲﻛﻨﻨﺪ
?
ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از رﻣﺰي ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ )ﺑﺎ ﻧﻤﺎد رﻣﺰﮔﺬار( رﻣﺰﮔﺬاري ﻣﻲﺷﻮد ﺗﺎ ﻋﻨﺼﺮ ﺑﻌﺪي ﺟﺮﻳﺎن ﻓﺸﺮده دادهﻫﺎ را ﺗﺸﻜﻴﻞ دﻫﺪ .رﻣﺰﮔﺬار
ﺗﺼﻮﻳﺮ en , (b)6.8را از ﻛﻠﻤﺎت رﻣﺰي درﻳﺎﻓﺖ ﺷﺪه ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ ﺑﺎزﺳﺎزي ﻣﻲﻛﻨﺪ و ﻋﻤﻠﻴﺎت ﻣﻌﻜﻮس را اﻧﺠﺎم ﻣﻲدﻫﺪ.
?
ﻣﻲﺗﻮان ﺑﺮاي ﺗﻮﻟﻴﺪ ˆ fnاز روﺷﻬﺎي ﺳﺎزﮔﺎر ﮔﻮﻧﺎﮔﻮن ﻣﻮﺿﻌﻲ و ﻛﻠﻲ اﺳﺘﻔﺎده ﻛﺮد .اﻳﻦ ﭘﻴﺶﺑﻴﻨﻲﻫﺎ در اﻛﺜﺮ ﻣﻮارد ﺑﺎ ﺗﺮﻛﻴﺐ ﺧﻄﻲ mﻋﺪد
?
در اﻳﻨﺠﺎ mﺗﺮﺗﻴﺐ اﺑﺰار ﭘﻴﺶﺑﻴﻨﻲ ﻛﻨﻨﺪه ﺧﻄﻲ اﺳﺖ round .ﺗﺎﺑﻌﻲ اﺳﺖ ﻛﻪ ﺑﺮاي ﮔﺮد ﻛﺮدن و رﺳﻴﺪن ﺑﻪ ﻧﺰدﻳﻜﺘﺮﻳﻦ ﻋﺪد ﺻﺤﻴﺢ ﺑﻪ ﻛﺎر
ﺑﺮده ﻣﻲﺷﻮد )ﻣﺎﻧﻨﺪ ﺗﺎﺑﻊ ﻣﻄﺎﺑﻖ ﺑﺎ آن در ﻧﺮم اﻓﺰار (Matlabو aiدر i=1, 2, … ,mﺿﺮاﻳﺐ ﭘﻴﺶﺑﻴﻨﻲﻫﺎ ﻫﺴﺘﻨﺪ .اﻳﻦ ﻣﻌﺎدﻟﻪ در رﻣﺰﮔﺬاري
?
30
ﻫﺮ ﻳﻚ از ﻣﺘﻐﻴﺮﻫﺎي زﻳﺮﻧﻮﻳﺲ ﺑﻪ ﺻﻮرت ﺗﺎﺑﻌﻲ از ﻣﺨﺘﺼﺎت ﻓﻀﺎﻳﻲ xو yﺑﻴﺎن ﻣﻲﺷﻮد .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺗﺎﺑﻊ ) f(x, yﺗﺎﺑﻊ ﻋﻨﺎﺻﺮ
ﺗﺼﻮﻳﺮي ﻗﺒﻠﻲ در ﺧﻂ ﭘﻴﻤﺎﻳﺶ ﺟﺎري اﺳﺖ.ﺗﺎﺑﻌﻬﺎي mat2Lpc, Lpc2mat Mﺑﺮاي اﺟﺮاي رﻣﺰﮔﺬاري ﻫﻤﺮاه ﺑﺎ ﭘﻴﺶﺑﻴﻨﻲ و رﻣﺰﮔﺸﺎي
)ﺑﻪ ﻏﻴﺮ از ﻣﺮاﺣﻞ ﻧﻤﺎدﻳﻦ رﻣﺰﮔﺬاري و رﻣﺰﮔﺸﺎﻳﻲ( ﻫﺴﺘﻨﺪ .ﺗﺎﺑﻊ رﻣﺰﮔﺬار mat2Lpcﺑﺮاي ﭘﻴﺶﺑﻴﻨﻲ ﻫﺮ ﻳﻚ از ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي و ﻗﺮار دادن
آن در دادهﻫﺎي ورودي xاز ﺣﻠﻘﻪ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ .ﺑﻌﺪ از ﻫﺮ دﻓﻌﻪ ﺗﻜﺮار xsﻛﻪ ﺑﻪ ﺻﻮرت ﻛﭙﻲ از ط اﺳﺖ ﻳﻚ ﺳﺘﻮن ﺑﻪ ﺳﻤﺖ راﺳﺖ ﻣﻨﺘﻘﻞ
ﻣﻲﺷﻮد و ﻻﻳﻪﮔﺬاري ﺳﻤﺖ ﭼﭗ ﺻﻔﺮ اﺳﺖ و ﺿﺮﺑﺪر ﻳﻚ ﺿﺮﻳﺐ ﭘﻴﺶﺑﻴﻨﻲ ﻣﻨﺎﺳﺐ ﻣﻲﺷﻮد و ﺑﺎ ﻣﺠﻤﻮع ﭘﻴﺶﺑﻴﻨﻲﻫﺎي pﺟﻤﻊ ﻣﻲﺷﻮد .از
آﻧﺠﺎﺋﻲ ﻛﻪ ﺗﻌﺪاد ﺿﺮاﻳﺐ ﭘﻴﺶﺑﻴﻨﻲ ﺧﻄﻲ ﻣﻌﻤﻮﻻً اﻧﺪك اﺳﺖ ،ﻛﻞ اﻳﻦ ﻓﺮاﻳﻨﺪ ﺳﺮﻳﻊ اﻧﺠﺎم ﻣﻲﺷﻮد .در ﻓﻬﺮﺳﺖ زﻳﺮ ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﮔﺮ
ﺗﺎﺑﻊ رﻣﺰﮔﺸﺎي Lpc2matﻋﻤﻠﻴﺎت ﻣﻌﻜﻮس ﻫﻤﺘﺎي رﻣﺰﮔﺬار ﺧﻮد ﺑﺎ ﻧﺎم mat2lpcرا اﻧﺠﺎم ﻣﻲدﻫﺪ .ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﻓﻬﺮﺳﺖ زﻳﺮ دﻳﺪه
ﻣﻲﺷﻮد ،از ﺣﻠﻘﻪاي ﺑﺎ nﻋﺪد ﺗﻌﺪاد دﻓﻌﺎت ﺗﻜﺮار اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ ﻛﻪ در اﻳﻨﺠﺎ nﺗﻌﺪاد ﺳﺘﻮﻧﻬﺎي ﻣﺎﺗﺮﻳﺲ رﻣﺰﮔﺬاري ﺷﺪه دادهﻫﺎي ورودي y
اﺳﺖ .در ﻫﺮ دﻓﻌﻪ ﺗﻜﺮار ﻳﻚ ﺳﺘﻮن از دادهﻫﺎي ﺧﺮوﺟﻲ رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه xﻣﺤﺎﺳﺒﻪ ﻣﻲﺷﻮد زﻳﺮا ﻫﺮ ﺳﺘﻮن رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه ﺑﺮاي ﻣﺤﺎﺳﺒﻪ
ﻫﻤﻪ ﺳﺘﻮﻧﻬﺎي ﺑﻌﺪي ﺑﻪ ﻛﺎر ﻣﻲرود .ﺑﺮاي ﻛﺎﻫﺶ زﻣﺎن ﻣﺼﺮف ﺷﺪه در ﺣﻠﻘﻪ ﻓﻮق ﻗﺒﻞ از ﺷﺮوع ﺣﻠﻘﻪ ﻣﻘﺪار اﻳﻜﺲ ﭘﻴﺸﺎﭘﻴﺶ ﺑﻪ ﺣﺪاﻛﺜﺮ
ﻻﻳﻪﮔﺬاري ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮد .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻣﺤﺎﺳﺒﺎت ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﺗﻮﻟﻴﺪ ﭘﻴﺶﺑﻴﻨﻲﻫﺎ ﺑﺎ ﻫﻤﺎن ﺗﺮﺗﻴﺒﻲ ﻛﻪ در Lpc2mat
ﺑﺮاي ﺟﻠﻮﮔﻴﺮي از ﺧﻄﺎي ﮔﺮد ﻛﺮدن ﻧﻘﻄﻪ ﺷﻨﺎور اﻧﺠﺎم ﻣﻲﺷﺪ اﻧﺠﺎم ﻣﻲﺷﻮﻧﺪ.
31
function x = lpc2mat(y, f)
%LPC2MAT Decompresses a 1-D lossless predictive encoded matrix.
% X = LPC2MAT(Y, F) decodes input matrix Y based on linear
% prediction coefficients in F and the assumption of 1-D lossless
% predictive coding. If F is omitted, filter F = 1 (for previous
%
% See also MAT2LPC.
در اﻳﻨﺠﺎ ﺳﻄﺢ.( دﻳﺪه ﻣﻲﺷﻮدa)6.9 اﻳﺠﺎد ﺷﺪه اﺳﺖ در ﻋﻜﺲa=1 ﺗﺼﻮﻳﺮ داراي ﺧﻄﺎي ﭘﻴﺶﺑﻴﻨﻲ ﻛﻪ در ﺣﺎﻟﺖ.ﺗﻔﺎﺿﻠﻲ ﻣﻲﻧﺎﻣﻴﻢ
( ﭘﻴﺸﻴﻨﻪ ﻧﻤﺎي ﺧﻄﺎي ﭘﻴﺶﺑﻴﻨﻲb) 6.7 ( ﺗﺼﻮﻳﺮ ﺧﻄﺎي ﭘﻴﺶﺑﻴﻨﻲ ﺗﺼﻮﻳﺮa) :6.9 ﺗﺼﻮﻳﺮ
32
ﺧﻄﺎﻫﺎي ﻣﺜﺒﺖ و ﻣﻨﻔﻲ ﻏﻴﺮﺻﻔﺮ ﺑﻪ ﺗﺮﺗﻴﺐ ﺗﻮﺳﻂ mat2grayﺳﺎﻳﻪﻫﺎي روﺷﻦ و ﺗﻴﺮه ﺧﺎﻛﺴﺘﺮي ﻣﻲﺷﻮﻧﺪ.
;)'>> f = imread('Aligned Matches.tif
;)>> e = mat2huff(f
;))>> imshow(mat2gray(e
)>> entropy(e
= ans
5.9727
ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺷﺎﺧﺺ درﺟﻪ ﺑﻲﻧﻄﻤﻲ ﺧﻄﺎي ﭘﻴﺶﺑﻴﻨﻲ eﺑﺴﻴﺎر ﻛﻤﺘﺮ از ﻫﻤﻴﻦ ﺷﺎﺧﺺ در ﺗﺼﻮﻳﺮ اﺻﻠﻲ fاﺳﺖ .ﻣﻘﺪار اﻳﻦ ﺷﺎﺧﺺ
از ) 7.3505ﻛﻪ در اواﻳﻞ اﻳﻦ ﺑﺨﺶ ﻣﺤﺎﺳﺒﻪ ﺷﺪ( ﺑﻪ 5.9727ﺑﻴﺖ در ﻫﺮ ﭘﻴﻜﺴﻞ ﻛﺎﻫﺶ ﻳﺎﻓﺘﻪ اﺳﺖ در ﺻﻮرﺗﻲ ﻛﻪ در ﺗﺼﻮﻳﺮﻫﺎي mﺑﻴﺘﻲ
ﺑﺮاي ﻧﻤﺎﻳﺶ دﻗﻴﻖ ﺗﻮاﻟﻲ ﺧﻄﺎي ﺣﺎﺻﻞ از آﻧﻬﺎ ﺑﺎﻳﺪ m+1ﺑﻴﺖ ﻣﻮرد ﻧﻴﺎز اﺳﺖ .ﻛﺎﻫﺶ ﺷﺎﺧﺺ درﺟﻪ ﺑﻲﻧﻈﻤﻲ ﻧﺸﺎن ﻣﻲدﻫﺪ ﻛﻪ ﺗﺼﻮﻳﺮ
ﺧﻄﺎي ﭘﻴﺶﺑﻴﻨﻲ را ﻣﻲﺗﻮان ﻛﺎرآﻣﺪﺗﺮ رﻣﺰﮔﺬاري ﻛﺮد ﺗﺎ ﺗﺼﻮﻳﺮ اﺻﻠﻲ ﻫﺪف ﻧﻘﺸﻪ ﺑﺮداري ﺷﻮد .ﺑﻨﺎ ﺑﺮ اﻳﻦ
;)>> c = mat2huff(e
)>> cr = imratio(f, c
= cr
1.3311
ﻫﻤﺎن ﻃﻮر ﻛﻪ اﻧﺘﻈﺎر ﻣﻲرود ﻣﻲﺑﻴﻨﻴﻢ ﻧﺴﺒﺖ ﻓﺸﺮدهﺳﺎزي از ) 1.0821وﻗﺘﻲ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﻣﺴﺘﻘﻴﻤﺎً ﺑﺎ ﻫﺎﻓﻤﻦ رﻣﺰﮔﺬاري ﻣﻲﺷﻮﻧﺪ( ﺑﻪ
ﺳﺎﺑﻘﻪ ﻧﻤﺎي ﺧﻄﺎي ﭘﻴﺶﺑﻴﻨﻲ eدر ﺗﺼﻮﻳﺮ (b)6.9ﻧﺸﺎن داده ﺷﺪه اﺳﺖ و ﻣﺤﺎﺳﺒﻪ آن ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ:
;)>> [h, x] = hist(e(:) * 512, 512
;)'>> figure; bar(x, h, 'k
ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻧﺰدﻳﻚ ﺑﻪ ﺻﻔﺮ ﺑﻪ ﻧﻘﻄﻪ اوج ﺧﻮد ﻣﻲرﺳﺪ و در ﻗﻴﺎس ﺑﺎ ﻣﻴﺰان ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺗﺼﻮﻳﺮﻫﺎي ورودي اﺧﺘﻼف اﻧﺪﻛﻲ
دارد )ﺗﺼﻮﻳﺮ .(d 6.7در اﻳﻦ ﺣﺎﻟﺖ ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﺷﺎﺧﺼﻬﺎي ﻣﺤﺎﺳﺒﻪ ﺷﺪه درﺟﻪ ﺑﻲﻧﻈﻤﻲ دﻳﺪﻳﻢ در ﻓﺮاﻳﻨﺪﻫﺎي اﻳﺠﺎد اﺧﺘﻼف و
ﭘﻴﺶﺑﻴﻨﻲ اﻛﺜﺮ اﻓﺰوﻧﮕﻲﻫﺎي ﺑﻴﻦ ﭘﻴﻜﺴﻠﻬﺎ از ﺑﻴﻦ ﻣﻲرود .ﺑﺎ ﻧﻤﺎﻳﺶ روش رﻣﺰﮔﺬاري ﺑﺪون اﺗﻼف اﻃﻼﻋﺎت ﻳﻌﻨﻲ ﺑﺎ رﻣﺰﮔﺸﺎﻳﻲ Cو ﻣﻘﺎﻳﺴﻪ
33
.6.4اﻓﺰوﻧﮕﻲ رواﻧﻲ -دﻳﺪاري ) (Psychovisual Redundancy
اﻳﻦ ﻧﻮع اﻓﺰوﻧﮕﻲ ﺑﺮ ﺧﻼف رﻣﺰﮔﺸﺎﻳﻲ و اﻓﺰوﻧﮕﻲ ﺑﻴﻦ ﭘﻴﻜﺴﻠﻲ ﺑﺎ اﻃﻼﻋﺎت ﺗﺼﻮﻳﺮي ﺳﻨﺠﺶﭘﺬﻳﺮ واﻗﻌﻲ ﺳﺮ و ﻛﺎر دارد .ﺣﺬف آن از آن ﺟﻬﺖ
ﻣﻄﻠﻮب اﺳﺖ ﻛﻪ اﻳﻦ اﻃﻼﻋﺎت ﺑﺮاي ﭘﺮدازش ﺗﺼﻮﻳﺮي ﻋﺎدي ﺿﺮوري ﻧﻴﺴﺖ .از آﻧﺠﺎﺋﻲ ﻛﻪ ﺣﺬف دادهﻫﺎي اﺿﺎﻓﻲ ﻣﺮﺑﻮط ﺑﻪ ﺟﻨﺒﻪ رواﻧﻲ –
دﻳﺪاري ﺑﺎﻋﺚ از دﺳﺖ دادن اﻃﻼﻋﺎت ﻛﻤﻲ ﻣﻲﺷﻮد آن را ﻛﻤﻲ ﺳﺎزي ﻣﻲﻧﺎﻣﻴﻢ .اﻳﻦ ﻛﻠﻤﻪ ﻓﻨﻲ ﺑﺎ ﻛﺎرﺑﺮد اﻳﻦ واژه ﺳﺎزﮔﺎر اﺳﺖ ﻳﻌﻨﻲ ﻧﻘﺸﻪ
ﺑﺮداري از ﺣﻴﻄﻪ ﮔﺴﺘﺮدهاي از دادهﻫﺎي ورودي ﺑﺮاي اﻳﺠﺎد ﺗﻌﺪاد ﻣﺤﺪودي دادهﻫﺎي ﺧﺮوﺟﻲ .از آﻧﺠﺎﺋﻲ ﻛﻪ اﻳﻦ ﻓﺮاﻳﻨﺪ ﺑﺮﮔﺸﺖﻧﺎﭘﺬﻳﺮ اﺳﺖ
)ﻳﻌﻨﻲ اﻃﻼﻋﺎت دﻳﺪاري از ﺑﻴﻦ ﻣﻲرود( ﻛﻤﻲ ﺳﺎزي ﻣﻌﻤﻮﻻً ﻣﻨﺠﺮ ﺑﻪ ﻓﺸﺮدهﺳﺎزي ﻫﻤﺮاه ﺑﺎ از دﺳﺖ دادن اﻃﻼﻋﺎت ﻣﻲﺷﻮد.
ﻋﻜﺴﻬﺎي ﺗﺼﻮﻳﺮ 6.10را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ .در ﺗﺼﻮﻳﺮ (a).6.10ﻳﻚ ﻋﻜﺲ ﺗﻚ رﻧﮓ ﺑﺎ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي 256ﻧﺸﺎن داده ﺷﺪه اﺳﺖ .ﺗﺼﻮﻳﺮ
(b)6.10ﻫﻤﺎن ﺗﺼﻮﻳﺮ ﺑﻌﺪ از ﻛﻤﻲ ﺳﺎزي 4ﺑﻴﺘﻲ در 16ﺳﻄﺢ ﻣﺤﺘﻤﻞ اﺳﺖ .ﻧﺴﺒﺖ ﻓﺸﺮدهﺳﺎزي 2:1اﺳﺖ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ
ﻣﺤﺪودهﺳﺎزي ﻛﺎذب در ﻧﻮاﺣﻲ ﻫﻤﻮار ﺗﺼﻮﻳﺮ اﺻﻠﻲ دﻳﺪه ﻣﻲﺷﻮد .اﻳﻦ ﺗﺎﺛﻴﺮ ﺗﺼﻮﻳﺮي ﻃﺒﻴﻌﻲ ﻧﻤﺎﻳﺶ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺗﺼﻮﻳﺮ اﺳﺖ.
در ﺗﺼﻮﻳﺮ (c)6.10ﺑﻬﺒﻮد وﺿﻌﻴﺖ ﺑﺎ ﻛﻤﻲ ﺳﺎزي دﻳﺪه ﻣﻲﺷﻮد ﻛﻪ از ﺧﺼﻮﺻﻴﺎت ﭼﺸﻢ اﻧﺴﺎن ﻫﻨﮕﺎم ﺗﻤﺎﺷﺎي ﺗﺼﻮﻳﺮ ﺑﻬﺮهﺑﺮداري ﺷﺪه اﺳﺖ.
ﮔﺮﭼﻪ ﻓﺸﺮدهﺳﺎزي ﺣﺎﺻﻞ از اﻳﻦ ﻧﻮع ﻛﻤﻲ ﺳﺎزي 2:1اﺳﺖ ﺑﺮاي ﻛﺎﻫﺶ ﻣﺤﺪوده ﺳﺎزي ﻛﺎذب دادﻧﻪﻫﺎي ﺑﻴﺸﺘﺮ وﻟﻲ ﻧﻪ ﭼﻨﺪان ﻧﺎراﺣﺖ ﻛﻨﻨﺪه
ﻛﻨﺪه دﻳﺪه ﻣﻲﺷﻮﻧﺪ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ در ﻫﺮ 2ﻣﻮرد ﻧﺎﻓﺸﺮدهﺳﺎزي ﻏﻴﺮﺿﺮوري و ﻏﻴﺮﻣﻤﻜﻦ اﺳﺖ) .ﻳﻌﻨﻲ ﻛﻤﻲ ﺳﺎزي ﻋﻤﻠﻴﺎت
ﺑﺮﮔﺸﺖﻧﺎﭘﺬﻳﺮ اﺳﺖ(.
ﺗﺼﻮﻳﺮ (a) :6.10ﺗﺼﻮﻳﺮ اﺻﻠﻲ (b)0ﻛﻤﻲ ﺳﺎزي ﻳﻜﺴﺎن ﺗﺎ 16ﺳﻄﺢ ))(cﻣﻲ ﺳﺎزي اي ﺟﻲ اس ﺗﺎ 16ﺳﻄﺢ
34
روش ﻣﻮرد اﺳﺘﻔﺎده ﺑﺮاي ﺗﻮﻟﻴﺪ ﺗﺼﻮﻳﺮ (c)6.10را ﻛﻤﻲ ﺳﺎزي ﺑﻬﻴﻨﻪ ﺷﺪه ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي ) )improved gray_scale (IGS
(quantizationﻣﻲﻧﺎﻣﻴﻢ .در اﻳﻦ ﺣﺎﻟﺖ ﺣﺴﺎﺳﻴﺖ ﭼﺸﻢ ﻧﺴﺒﺖ ﺑﻪ ﻟﺒﻪﻫﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲﺷﻮد و ﺑﺎ ﺗﺨﺼﻴﺺ ﻳﻚ ﻋﺪد ﺗﺼﺎدﻓﻲ ﺑﻪ ﻫﺮ ﻋﻨﺼﺮ
ﻛﻪ از ﺑﻴﺘﻬﺎي ﺗﺤﺘﺎﻧﻲ ﭘﻴﻜﺴﻠﻬﺎي ﻣﺠﺎور ﺗﻮﻟﻴﺪ ﻣﻲﺷﻮد ﻗﺒﻞ از ﻛﻤﻲ ﺳﺎزي ﻧﺘﺎﻳﺞ آن را ﺗﺠﺰﻳﻪ ﻣﻲﻛﻨﻨﺪ .از آﻧﺠﺎﺋﻲ ﻛﻪ ﺑﻴﺘﻬﺎي ﭘﺎﻳﻴﻦ رﺗﺒﻪ
ﺗﺼﺎدﻓﻲ ﻫﺴﺘﻨﺪ ارﻗﺎم ﺗﺼﺎدﻓﻲ ﺗﺨﺼﻴﺺ داده ﻣﻲﺷﻮﻧﺪ ﻛﻪ ﺑﺴﺘﮕﻲ ﺑﻪ ﺧﺼﻮﺻﻴﺎت ﻣﻮﺿﻌﻲ ﺗﺼﻮﻳﺮ و ﻟﺒﻪﻫﺎي ﻣﺼﻨﻮﻋﻲ ﻣﺮﺑﻮط ﺑﻪ ﻣﺤﺪوده ﺳﺎزي
ﻛﺎذب دارﻧﺪ .ﺗﺎﺑﻊ quantizeﻫﻢ ﻛﻤﻲ ﺳﺎزي ﺑﻬﻴﻨﻪ ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي و ﻫﻢ ﺑﺮش ﺳﻨﺘﻲ ﭘﺎﻳﻴﻦ رﺗﺒﻪ ) (low_orderﺑﻴﺘﻬﺎ را اﻧﺠﺎم
ﻣﻲدﻫﺪ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﺟﺮاي ﻛﻤﻲ ﺳﺎزي ﺑﻬﻴﻨﻪ ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي ﺑﺮداري اﻧﺠﺎم ﻣﻲﺷﻮد ﺗﺎ دادهﻫﺎي ورودي xﻫﺮ دﻓﻌﻪ ﺑﻪ اﻧﺪازه
ﻳﻚ ﺳﺘﻮن ﭘﺮدازش ﺷﻮﻧﺪ .ﺑﺮاي اﻳﺠﺎد ﺳﺘﻮﻧﻲ از ﻧﺘﺎﻳﺞ 4ﺑﻴﺘﻲ در ﺗﺼﻮﻳﺮ (c)6.10ﻣﺠﻤﻮع ﺳﺘﻮن sﻛﻪ در اﺑﺘﺪا ﺻﻔﺮ ﻫﺴﺘﻨﺪ ﺑﻪ ﺻﻮرت ﻣﺠﻤﻮع
ﺳﺘﻮن اﻳﻜﺲ و 4ﺑﻴﺖ ﻣﺠﻤﻮع ﻛﻨﻮﻧﻲ اﻳﺠﺎد ﻣﻲﺷﻮد .اﮔﺮ 4ﺑﻴﺖ ﻣﻬﻢ ﻫﺮ ﻳﻚ از اﻳﻜﺴﻬﺎ (1111)2ﺑﺎﺷﺪ در ﻋﻮض (0000)2اﻓﺰوده ﻣﻲﺷﻮد .ﺑﻨﺎ
ﺑﺮ اﻳﻦ 4ﺑﻴﺖ ﻣﻬﻢ ﻣﺠﻤﻮع ﺣﺎﺻﻞ از آن ﺑﻪ ﻋﻨﻮان ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي رﻣﺰﮔﺬاري ﺷﺪه ﺳﺘﻮن ﭘﺮدازش ﺷﺪه ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮﻧﺪ.
)function y = quantize(x, b, type
%QUANTIZE Quantizes the elements of a UINT8 matrix.
% Y = QUANTIZE(X, 8, TYPE) quantizes X to B bits. Truncation is
% used unless TYPE is 'igs' for Improved Gray Scale quantization.
;))error(nargchk(2, 3, nargin % Check input arguments
… | )if ndims(x) ~= 2 | ~isreal(x
)'~isnumeric(x) | ~isa(x, 'uint8
;)'error('The input must be a UINT8 numeric matrix.
end
35
ﻛﻤﻲ ﺳﺎزي ﺑﻬﻴﻨﻪ ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي در اﻛﺜﺮ روﺷﻬﺎي ﻛﻤﻲ ﺳﺎزي ﻛﻪ ﺗﺎﺛﻴﺮ ﻣﺴﺘﻘﻴﻢ ﺑﺮ ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺗﺼﻮﻳﺮﻫﺎي ﻫﺪف ﻓﺸﺮدهﺳﺎزي
ﻣﻌﻤﻮﻻً ﻣﻴﺰان ﺗﻔﻜﻴﻚ ﭘﺬﻳﺮي ﻓﻀﺎﻳﻲ و ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي ﻛﺎﻫﺶ ﻣﻲﻳﺎﺑﺪ .اﮔﺮ ﺗﺼﻮﻳﺮ ﺑﺮاي ﻛﺎﻫﺶ اﻓﺰوﻧﮕﻲ ﺑﻴﻦ ﭘﻴﻜﺴﻠﻬﺎ ﻧﻘﺸﻪ ﺑﺮداري ﺷﺪه
ﺑﺎﺷﺪ ،ﻛﻤﻲ ﺳﺎزي ﻣﻲﺗﻮاﻧﺪ ﻣﻨﺠﺮ ﺑﻪ ﻛﺎﻫﺶ ﻛﻴﻔﻲ ﺳﺎﻳﺮ ﺟﻨﺒﻪﻫﺎ ﺷﻮد ﻣﺜﻼً ﻟﺒﻪﻫﺎي ﺗﺎر )از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﻓﺮﻛﺎﻧﺲ ﺑﺎﻻ( وﻗﺘﻲ از ﻓﺮﻛﺎﻧﺲ
ﻣﺜﺎل :6.7ادﻏﺎم ﻛﻤﻲ ﺳﺎزي ﺑﻬﻴﻨﻪ ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي روﺷﻬﺎي رﻣﺰﮔﺬاري ﻫﺎﻓﻤﻦ و ﭘﻴﺶﺑﻴﻨﻲ ﺑﺪون اﺗﻼف اﻃﻼﻋﺎت
ﮔﺮﭼﻪ ﻛﻤﻲ ﺳﺎزي ﻛﻪ ﺑﺮاي اﻳﺠﺎد ﺗﺼﻮﻳﺮ (c)6.10ﺑﻪ ﻛﺎر ﺑﺮده ﺷﺪه اﺳﺖ اﻛﺜﺮ اﻓﺰوﻧﮕﻲﻫﺎي رواﻧﻲ – ﺗﺼﻮﻳﺮي ﺑﺎ ﺗﺎﺛﻴﺮ اﻧﺪك ﺑﺮ ﻛﻴﻔﻴﺖ ﺗﺼﻮﻳﺮ
ﺑﺮﻃﺮف ﻣﻲﻛﻨﺪ ،وﻟﻲ ﺑﺮاي ﻓﺸﺮدهﺳﺎزي ﺑﻴﺸﺘﺮ از ﺷﮕﺮدﻫﺎي 2ﺑﺨﺶ ﻗﺒﻞ ﺑﺮاي ﻛﺎﻫﺶ اﻓﺰوﻧﮕﻲ ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي و رﻣﺰﮔﺬاري اﺳﺘﻔﺎده
ﻣﻲﺷﻮد .در واﻗﻊ ﻣﻲﺗﻮان ﻣﻴﺰان ﻓﺸﺮدهﺳﺎزي ﻛﻤﻲ ﺳﺎزي ﺑﻬﻴﻨﻪ ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي را ﺗﺎ 2ﺑﺮاﺑﺮ اﻓﺰاﻳﺶ داد .در ﻓﺮﻣﺎﻧﻬﺎي زﻳﺮ ﻛﻤﻲ ﺳﺎزي
ﺑﻬﻴﻨﻪ ﻣﻘﻴﺎس ﺧﺎﻛﺴﺘﺮي ،رﻣﺰﮔﺬاري دادهﻫﺎ ﺑﺮاي ﭘﻴﺶﺑﻴﻨﻲ ﺑﺪون اﺗﻼف اﻃﻼﻋﺎت ،و رﻣﺰﮔﺬاري ﻫﺎﻓﻤﻦ ﺑﺮاي ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮ (a).6.10ﺗﺎ
ﻧﺘﻴﺠﻪ رﻣﺰﮔﺬاري Cرا ﻣﻲﺗﻮان ﺑﺎ ﻣﻌﻜﻮس ﻛﺮدن روﻧﺪ ﻋﻤﻠﻴﺎت )ﺑﺪون ﻣﻌﻜﻮس ﻛﺮدن ﻛﻤﻲ ﺳﺎزي( اﻧﺠﺎم داد.
;)>> ne = huff2mat(c
;)>> nqs = lpc2mat(ne
;>> nq = 16 * nqs
)>> compare(q, nq
= ans
0
)>> rmse = compare(f, nq
= rmse
6.8382
ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺧﻄﺎي ﺟﺬر ﻣﻴﺎﻧﮕﻴﻦ ﻣﺮﺑﻌﺎت ﺗﺼﻮﻳﺮ ﻧﺎﻓﺸﺮده ﺷﺪه ﺣﺪود 7ﺳﻄﺢ ﺧﺎﻛﺴﺘﺮي اﺳﺖ و رﻳﺸﻪ اﻳﻦ ﺧﻄﺎ ﻣﺮﺣﻠﻪ ﻛﻤﻲ ﺳﺎزي
اﺳﺖ.
36
.6.5ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮﻫﺎ ﺑﺎ ﭘﺴﻮﻧﺪ jpeg
ﺷﮕﺮدﻫﺎي ﻓﺼﻠﻬﺎي ﻗﺒﻞ ﺑﺮ اﺳﺎس ﻛﺎر روي ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي اﺳﺖ .و ﺑﻨﺎ ﺑﺮ اﻳﻦ روﺷﻬﺎي داﻣﻨﻪ ﻓﻀﺎﻳﻲ)(spatial domain methods
ﻫﺴﺘﻨﺪ .در اﻳﻦ ﺑﺨﺶ ﻳﻚ ﺳﺮي روﺷﻬﺎي ﻓﺸﺮدهﺳﺎزي را در ﻧﻈﺮ ﻣﻲﮔﻴﺮﻳﻢ ﻛﻪ ﺑﺮ اﺳﺎس ﺗﻐﻴﻴﺮ ﺗﺒﺪﻳﻞ ﺗﺼﻮﻳﺮ ﻫﺴﺘﻨﺪ .ﻫﺪف ﻣﺎ ﻣﻌﺮﻓﻲ
ﺑﺮاي ﺗﺸﺮﻳﺢ ﻧﺤﻮه ﻛﺎﻫﺶ اﻓﺰوﻧﮕﻲ ﺗﺼﻮﻳﺮ در ﺑﺨﺸﻬﺎي 6.2ﺗﺎ 6.4ﺑﺎ ﻣﺜﺎﻟﻬﺎي ﺑﻴﺸﺘﺮ و ﺑﺮاي ﻣﻄﻠﻊ ﻛﺮدن ﺧﻮاﻧﻨﺪﮔﺎن از روﺷﻬﺎي ﻫﻨﺮي
ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮ ﺑﺎﻳﺪ ﺑﮕﻮﻳﻴﻢ ﻛﻪ اﺳﺘﺎﻧﺪاردﻫﺎي ﻋﺮﺿﻪ ﺷﺪه )ﻛﻪ ﻣﻮارد ﻧﺰدﻳﻚ ﺑﻪ آﻧﻬﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲﺷﻮﻧﺪ( ﺑﺮاي ﻛﺎر ﺑﺎ اﻧﻮاع ﺗﺼﻮﻳﺮﻫﺎ و
در رﻣﺰﮔﺬاري ﺗﺒﺪﻳﻠﻲ ﻣﺎﻧﻨﺪ ﻳﻚ ﺗﺒﺪﻳﻞ ﺧﻄﻲ ﺑﺮﮔﺸﺖﭘﺬﻳﺮ ﻫﻤﭽﻮن DFTﻓﺼﻞ 4ﻳﺎ ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰDCT
M −1N −1
(2 x + 1)uπ (2 x + 1)vπ
= )T (u , v ∑ ∑ f ( x, y)a(u )a(v) cos 2M
cos
2N
x =0 y =0
1
u=0
a (u ) = M
2 u = 1,2,..., M − 1
M
T (u , v)
Tˆ (u , v) = round
Z (u , v)
αvﺑﺮاي ﻧﻘﺸﻪ ﺑﺮداري ﺗﺼﻮﻳﺮ روي ﺿﺮاﻳﺐ ﺗﺒﺪﻳﻞ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد ﻛﻪ ﭘﺲ از آن ﻛﻤﻲ ﺳﺎزي و رﻣﺰﮔﺬاري ﻣﻲﺷﻮﻧﺪ .در اﻛﺜﺮ ﺗﺼﻮﻳﺮﻫﺎي
ﻃﺒﻴﻌﻲ ﺑﻴﺸﺘﺮ ﺿﺮاﻳﺐ ﺑﺰرﮔﻲ اﻧﺪﻛﻲ دارﻧﺪ و ﻣﻲﺗﻮان آﻧﻬﺎ را ﺑﺎ ﺗﺤﺮﻳﻒ اﻧﺪك ﺗﺼﻮﻳﺮ ﻛﻤﻲ ﺳﺎزي ﻛﺮد.
Jpeg .6.5.1
ﻳﻜﻲ از ﻣﺤﺒﻮﺑﺘﺮﻳﻦ و ﻛﺎﻣﻠﺘﺮﻳﻦ اﺳﺘﺎﻧﺪاردﻫﺎي ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮﻫﺎي ﺛﺎﺑﺖ ﭘﺴﻮﻧﺪ ) jpegﻣﺨﻔﻒ ﮔﺮوه ﻣﺘﺨﺼﺼﺎن ﺗﺼﻮﻳﺮﺑﺮداري
ﻣﺸﺘﺮك() (Joint Photographic Expert Groupاﺳﺖ .در ﺳﻴﺴﺘﻢ رﻣﺰﮔﺬاري ﻣﺒﻨﺎي اﻳﻦ ﭘﺴﻮﻧﺪ ﻛﻪ ﺑﺮ اﺳﺎس ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮس ﻣﺘﻤﺎﻳﺰ
اﺳﺖ و ﺑﺮاي اﻛﺜﺮ ﺑﺮﻧﺎﻣﻪﻫﺎي ﻛﺎرﺑﺮدي ﻛﺎﻓﻲ اﺳﺖ ﺗﺼﻮﻳﺮﻫﺎي ورودي و ﺧﺮوﺟﻲ ﻣﺤﺪود ﺑﻪ 8ﺑﻴﺖ ﻣﻲﺷﻮﻧﺪ در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺎدﻳﺮ ﺿﺮاﻳﺐ
ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ ﻣﺤﺪود ﺑﻪ 11ﺑﻴﺖ ﻣﻲﺷﻮﻧﺪ .ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﻧﻤﻮدار ﺳﺎده ﺷﺪه ﺗﺼﻮﻳﺮ a6.11دﻳﺪه ﻣﻲﺷﻮد ،اﻳﻦ ﻓﺸﺮدهﺳﺎزي در 4
ﻣﺮﺣﻠﻪ ﭘﻲ درﭘﻲ ﺑﻪ ﻧﺎﻣﻬﺎي اﺳﺘﺨﺮاج ﺗﺼﻮﻳﺮ ﻓﺮﻋﻲ ،8*8ﻣﺤﺎﺳﺒﻪ ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ ﻛﻤﻲ ﺳﺎزي و ﺗﺨﺼﻴﺺ رﻣﺰي ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ اﻧﺠﺎم
ﻣﻲﺷﻮد.
37
ﻣﺮﺣﻠﻪ اول در ﻓﺸﺮدهﺳﺎزي ﺑﺎ ﭘﺴﻮﻧﺪ jpegﺗﻘﺴﻴﻢ ﺗﺼﻮﻳﺮ ورودي ﺑﻪ ﻗﻄﻌﺎت ﺗﺼﻮﻳﺮي ﺑﺪون ﻫﻤﭙﻮﺷﻲ ﺑﻪ اﻧﺪازه 8*8اﺳﺖ .ﺳﭙﺲ آﻧﻬﺎ از ﭼﭗ
ﺑﻪ راﺳﺖ و ﺑﺎﻻ ﺑﻪ ﭘﺎﻳﻴﻦ ﭘﺮدازش ﻣﻲﺷﻮﻧﺪ .ﺣﻴﻦ ﭘﺮدازش ﻫﺮ ﻳﻚ از ﻗﻄﻌﺎت 8*8ﭘﻴﻜﺴﻠﻬﺎي 64آن ﺑﺎ ﺗﻔﺮﻳﻖ 2m-1ﺟﺎﺑﺠﺎ ﻣﻲﺷﻮﻧﺪ ﻛﻪ در
اﻳﻨﺠﺎ 2ﺗﻌﺪاد ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي ﺗﺼﻮﻳﺮ اﺳﺖ و ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ 2ﺑﻌﺪي آن ﻣﺤﺎﺳﺒﻪ ﻣﻲﺷﻮد.
ﺗﺼﻮﻳﺮ (a) :6.12آراﻳﻪ ﻫﻨﺠﺎرﻣﻨﺪ ﻛﻨﻨﺪه ﺗﺼﻮﻳﺮﻫﺎي jpegدر ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض ) (bﺗﻮاﻟﻲ ﺗﺮﺗﻴﺐ ﺿﺮﻳﺐ زﻳﮕﺰاگ jpeg
ﺳﭙﺲ ﺿﺮاﻳﺐ ﺣﺎﺻﻞ از آن ﻫﻤﺰﻣﺎن ﻣﻄﺎﺑﻖ ﺑﺎ راﺑﻄﻪ زﻳﺮ ﻫﻨﺠﺎرﻣﻨﺪ و ﻛﻤﻲ ﺳﺎزي ﻣﻲﺷﻮﻧﺪ.
?
در اﻳﻨﺠﺎ ) (u,v=0,1,…,7) T(u, vﺿﺮاﻳﺐ ﻫﻨﺠﺎرﻣﻨﺪ ﺳﺎزي و ﻛﻤﻲ ﺳﺎزي ﻫﺴﺘﻨﺪ و ) T (u, vﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ DCTﺗﺼﻮﻳﺮ
f(x, y) 8*8اﺳﺖ و ) z(u, vآراﻳﻪ ﻫﻨﺠﺎرﻣﻨﺪ ﺗﺒﺪﻳﻞ) (Transform normalizationاﺳﺖ ﻛﻪ ﻣﺎﻧﻨﺪ ﺗﺼﻮﻳﺮ (a)6.12اﺳﺖ .ﺑﺎ ﻣﻘﻴﺎس
ﺑﻨﺪي ) z(u, vﻣﻲﺗﻮان اﻧﻮاع ﻧﺴﺒﺘﻬﺎي ﻓﺸﺮدهﺳﺎزي را اﺟﺮا و ﺧﺼﻮﺻﻴﺎت ﺗﺼﻮﻳﺮ را ﺑﺎزﺳﺎزي ﻛﺮد.
ﭘﺲ از ﻛﻤﻲ ﺳﺎزي ﺿﺮاﻳﺐ ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ DCTﻫﺮ ﺑﻠﻮك ﻋﻨﺎﺻﺮ ) T(u, vﻣﻄﺎﺑﻖ ﺑﺎ اﻟﮕﻮي زﻳﮕﺰاگ ﺗﺼﻮﻳﺮ (b).6.12ﺛﺒﺖ
ﻣﻲﺷﻮﻧﺪ .از آﻧﺠﺎﺋﻲ ﻛﻪ آراﻳﻪ ﻣﺮﺗﺐ ﺷﺪه ﺗﻚ ﺑﻌﺪي )ﺿﺮاﻳﺐ ﻛﻤﻲ ﺳﺎزي ﺷﺪه( ﺑﺮ ﺣﺴﺐ اﻓﺰاﻳﺶ ﻓﺮﻛﺎﻧﺲ ﻓﻀﺎﻳﻲ ﺑﻪ ﺷﻜﻞ ﻛﻴﻔﻲ ﻣﺮﺗﺐ
ﻣﻲﺷﻮد رﻣﺰﮔﺬار ﻧﻤﺎد ﺗﺼﻮﻳﺮ (a)6.11ﺑﺮاي ﺑﻬﺮهﺑﺮداري از اﺟﺮاﻫﺎي ﻃﻮﻻﻧﻲ ﺻﻔﺮ ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ ﻛﻪ ﺑﻌﺪ از ﺛﺒﺖ ﺑﻪ دﺳﺖ ﻣﻲآﻳﻨﺪ .ﺿﺮاﻳﺐ
38
ﺑﺎ اﺳﺘﻔﺎده از ﻛﺪي ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ رﻣﺰﮔﺬاري ﻣﻲﺷﻮﻧﺪ ﻛﻪ ﻣﻘﺪار ﺿﺮﻳﺐ و ﺗﻌﺪاد ﺻﻔﺮﻫﺎي ﻗﺒﻞ راu=v=0 ﺑﻪ ﻏﻴﺮ ازT(u, v) ﻏﻴﺮﺻﻔﺮAC
ﺟﺪول. ﺗﺼﻮﻳﺮ ﻓﺮﻋﻲ ﻗﺒﻞ داردDC ﺿﺮﻳﺐ ﻛﺴﻴﻨﻮس ﻣﺘﻤﺎﻳﺰ ﺑﻪ ﺷﻜﻠﻲ ﻣﺘﻔﺎوت رﻣﺰﮔﺬاري ﻣﻲﺷﻮد ﻛﻪ ﺑﺴﺘﮕﻲ ﺑﻪ ﺿﺮﻳﺐ.ﺗﻌﺮﻳﻒ ﻣﻲﻛﻨﺪ
وﻟﻲ ﻛﺎرﺑﺮ ﻣﻲﺗﻮاﻧﺪ ﺟﺪوﻟﻬﺎي ﺳﻔﺎرﺷﻲ و آراﻳﻪﻫﺎي ﻫﻨﺠﺎرﺳﺎزي ﺧﻮدش را. ﻫﺎﻓﻤﻦ ﻃﺒﻖ اﺳﺘﺎﻧﺪاردﻫﺎ اراﺋﻪ ﺷﺪه اﺳﺖAC وDC رﻣﺰﮔﺬاري
.اﻳﺠﺎد ﻛﻨﺪ ﻛﻪ ﻣﻲﺗﻮاﻧﻨﺪ ﺑﺎ ﺧﺼﻮﺻﻴﺎت ﺗﺼﻮﻳﺮ ﻓﺸﺮده ﺷﺪه وﻓﻖ داده ﺷﻮﻧﺪ
زﻳﺮ ﻓﺮاﻳﻨﺪ رﻣﺰﮔﺬاري ﻣﺒﻨﺎي ﻣﺸﺎﺑﻪM file, m در اﻳﻦ ﻓﺼﻞ اﻣﻜﺎنﭘﺬﻳﺮ ﻧﻴﺴﺖ وﻟﻲ ﭘﺮوﻧﺪهﻫﺎيjpeg ﺗﺸﺮﻳﺢ اﺟﺮاي ﻛﺎﻣﻞ اﺳﺘﺎﻧﺪاردﻫﺎي
:دارﻧﺪ
function y = im2jpeg(x, quality)
%IM2JPEG Compresses an image using a JPEG approximation.
% Y = IM2JPEG(X, QUALITY) Compresses image X based on 8 x 8 DCT
% transforms, coefficient quantization, and Huffman symbol
% coding. Input QUALITY determines the amount of information that
% is lost and compression achieved. Y is an encoding structure
% containing fields:
%
% Y.size size of X
% Y.numblocks Number of 8-by-8 encoded blocks
% Y.quality Quality factor (as percent)
% Y.huffman Huffman encoding structure, as returned by
% MAT2HUFF
%
% See also JPEG2IM.
error(nargchk(1, 2, nargin)); % Check input arguments
if nargin(x) ~= 2 | ~isreal(x) | ~isnumeric(x) | ~isa(x, 'uint8')
error('The input must be a UINT8 image.');
end
if nargin < 2
quality = 1; % Default value for quality.
End
m = [ 16 11 10 16 24 40 51 61 % JPEG normalizing array
12 12 14 19 26 58 60 55 % and zig-zag reordering
14 13 16 24 40 57 69 56 % Pattern.
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99] * quality;
order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 …
41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 …
43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 …
45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 …
62 63 56 64 ];
[xm, xn] = size(x); % Get input size.
x = double(x) – 128; % Level shift input
t = dctmtx(8); % Compute 8 x 8 DCT matrix
39
;)xb = size(y, 2 % Get number of blocks
;)y = y(order, : % Reorder column elements
;eob = max(x(:)) + 1 % Create end-of-block symbol
;)r = zeros(numel(y) + size(y, 2), 1
;count = 0
for j = 1:xb % Process 1 block (col) at a time
;))))i = max(find(y(:, j % Find last non-zero element
)if isempty(i % Ni nonzero block values
;i = 0
end
;p = count + 1
;q = p + I
;]r(p:q) = [y(1:i, j); eob % Truncate trailing 0's, add EOB,
;count = count + i + 1 % and add to output vector
end
;][ = )r((count + 1):end % Delete unused portion of r
% Y.size ;)]= uint16([xm xn
% ;)Y.numblocks = uint16(xb
% Y.quality ;)= uint16(quality * 100
% Y.huffman ;)= mat2huff(r
ﺗﺎﺑﻊ im2jpegﻣﻄﺎﺑﻖ ﺑﺎ ﻧﻤﻮدار ﺗﺼﻮﻳﺮ (a).6.11ﻗﺴﻤﺘﻬﺎي 8*8ﻣﺘﻤﺎﻳﺰ و ﻳﺎ ﻗﻄﻌﻪﻫﺎي ﺗﺼﻮﻳﺮ ورودي xرا ﺗﻚ ﺑﻪ ﺗﻚ )ﺑﻪ ﺟﺎي ﭘﺮدازش
ﻳﻜﺠﺎي ﺗﺼﻮﻳﺮ( ﭘﺮدازش ﻣﻲﻛﻨﺪ 2 blkproc, im2col .ﺗﺎﺑﻊ ﻣﺨﺼﻮص ﭘﺮدازش ﻗﻄﻌﻪﻫﺎ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺮاي ﺳﺎده ﺳﺎزي ﻣﺤﺎﺳﺒﺎت ﺑﻪ ﻛﺎر ﺑﺮده
ﻓﺮاﻳﻨﺪ ﻛﺎر ﺑﺎ ﺗﺼﻮﻳﺮﻫﺎ را ﺳﺮﻳﻊ و ﺧﻮدﻛﺎر ﻣﻲﻛﻨﺪ .ﺗﺼﻮﻳﺮ ورودي )(aرا ﻫﻤﺮاه ﺑﺎ اﻧﺪازه ﻗﻄﻌﺎت آﻣﺎده ﭘﺮدازش درﻳﺎﻓﺖ ﻣﻲﻛﻨﺪ ﺳﭙﺲ از ﺗﺎﺑﻌﻲ
ﺑﺮاي ﭘﺮدازش آﻧﻬﺎ اﺳﺘﻔﺎده ﻣﻲﺷﻮد ﻛﻪ ﭘﺎراﻣﺘﺮﻫﺎي ورودي اﺧﺘﻴﺎري p1, p2و ﻏﻴﺮه را ﺑﺮاي ﺗﺎﺑﻊ ﭘﺮدازش دارﻧﺪ .ﺳﭙﺲ ﺗﺎﺑﻊ a blkprocرا ﺑﻪ
ﻗﻄﻌﺎت ) m*nﻫﻤﺮاه ﺑﺎ ﻫﺮ ﻧﻮع ﻻﻳﻪﮔﺬاري ﺻﻔﺮ( ﺗﺠﺰﻳﻪ ﻣﻲﻛﻨﺪ .ﺑﺎ ﻫﺮ ﺑﻠﻮك .ﭘﺎراﻣﺘﺮﻫﺎي p1, p2ﺗﺎﺑﻊ FUNرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲﻛﻨﺪ و ﻧﺘﺎﻳﺞ را
دوﻣﻴﻦ ﺗﺎﺑﻊ ﻣﺨﺼﻮص ﭘﺮدازش ﺑﻠﻮك ﻛﻪ ﺗﻮﺳﻂ im2jpegاﺳﺘﻔﺎده ﻣﻲﺷﻮد im2colاﺳﺖ .وﻗﺘﻲ blkprocﺑﺮاي اﺟﺮاي ﻋﻤﻠﻴﺎت روي
ﻗﻄﻌﺎت ﻣﻨﺎﺳﺐ ﻧﺒﺎﺷﺪ im2col ،ﺑﺮاي ﻣﺮﺗﺐ ﺳﺎزي دادهﻫﺎي ورودي ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد ﻃﻮري ﻛﻪ ﺑﺘﻮان ﻋﻤﻠﻴﺎت را ﺑﻪ ﻛﻠﻲ ﺳﺎدهﺗﺮ و
ﻛﺎرآﻣﺪﺗﺮ اﻧﺠﺎم داد) .ﻣﺜﻼً ﺑﺎ ﺑﺮدارﺑﻨﺪي ﻋﻤﻠﻴﺎت( .دادهﻫﺎي ﺧﺮوﺟﻲ im2colﻣﺎﺗﺮﻳﺴﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﻫﺮ ﻳﻚ از ﺳﺘﻮﻧﻬﺎي آن ﺣﺎوي ﻋﻨﺎﺻﺮ ﻳﻚ
ﻗﻄﻌﻪ ﻣﺘﻤﺎﻳﺰ از ﺗﺼﻮﻳﺮ ورودي اﺳﺖ .ﻗﺎﻟﺐ اﺳﺘﺎﻧﺪارد آن ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ:
)'B = im2col(A, [M N], 'distinct
40
در اﻳﻨﺠﺎ ﭘﺎراﻣﺘﺮﻫﺎي ] A,B,[M,Nﻗﺒﻼٌ در ﺗﺎﺑﻊ blkprocﺗﻌﺮﻳﻒ ﺷﺪﻧﺪ .رﺷﺘﻪ distinctﺑﻪ im2colﻣﻲﮔﻮﻳﺪ ﻛﻪ ﻗﻄﻌﺎت ﭘﺮدازش ﺷﺪه
ﻫﻤﭙﻮﺷﻲ ﻧﺪارﻧﺪ .رﺷﺘﻪ slidingاﻳﺠﺎد ﻳﻚ ﺳﺘﻮن را در bﺑﻪ ازاي ﻫﺮ ﻋﻨﺼﺮ ﺗﺼﻮﻳﺮي aﻧﺸﺎن ﻣﻲدﻫﺪ )ﮔﻮﻳﻲ ﻳﻚ ﻗﻄﻌﻪ در ﺗﺼﻮﻳﺮ درج ﺷﺪه
اﺳﺖ(.
ﺗﺎﺑﻊ blkprocدر im2jpegﺑﺮاي ﺗﺴﻬﻴﻞ ﻣﺤﺎﺳﺒﺎت ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ و ﻛﻤﻲ ﺳﺎزي و ﻫﻨﺠﺎرزداﻳﻲ ﺿﺮﻳﺐ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮﻧﺪ در
ﺣﺎﻟﻲ ﻛﻪ im2colﺑﺮاي ﺳﺎده ﺳﺎزي ﺗﻨﻈﻴﻢ ﻣﺠﺪد ﺿﺮاﻳﺐ ﻛﻤﻲ ﺷﺪه و ﻛﺸﻒ اﺟﺮاﻫﺎي ﺻﻔﺮ ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲﺷﻮد Im2jpeg .ﺑﺮ ﺧﻼف
اﺳﺘﺎﻧﺪارد jpegﻓﻘﻂ اﺟﺮاﻫﺎي آﺧﺮ ﺻﻔﺮ را در ﻫﺮ ﻗﻄﻌﻪ ﺿﺮﻳﺐ ﻣﺮﺗﺐ ﺷﺪه ﻧﺸﺎن ﻣﻲدﻫﺪ و ﻛﻞ اﺟﺮاي آن را ﺑﺎ ﻧﻤﺎد eobﺟﺎﻳﮕﺰﻳﻦ ﻣﻲﻛﻨﺪ.
ﮔﺮﭼﻪ ﻧﺮم اﻓﺰار MATLABﻳﻚ ﺗﺎﺑﻊ ﻛﺎرآﻣﺪ ﻣﺒﺘﻨﻲ ﺑﺮ FFTﺑﺮاي ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ DCTﺗﺼﻮﻳﺮﻫﺎي ﺑﺰرگ دارد )ﻛﻪ در ﻣﻄﺎﻟﺐ
راﻫﻨﻤﺎي ﺗﺎﺑﻊ dct2ﺗﺸﺮﻳﺢ ﺷﺪه اﺳﺖ( وﻟﻲ im2jpegاز ﻳﻚ ﻓﺮﻣﻮل ﻣﺎﺗﺮﻳﺴﻲ دﻳﮕﺮ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ.
Tﺑﺮاي ﻧﺸﺎن دادن ﻋﻤﻠﻴﺎت ﺟﺎﺑﺠﺎﻳﻲ ﺑﻪ ﻛﺎر ﻣﻲرود .در ﺻﻮرت اﻧﺠﺎم ﻧﺸﺪن ﻛﻤﻲ ﺳﺎزي ﻣﻌﻜﻮس ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ ﺗﻲ ﺑﻪ ﺷﺮح زﻳﺮ
اﺳﺖ:
F = H T TH
اﻳﻦ ﻓﺮﻣﻮل ﻣﺨﺼﻮﺻﺎً وﻗﺘﻲ ﻣﻮﺛﺮ اﺳﺖ ﻛﻪ ﺗﺼﻮﻳﺮﻫﺎي ﻣﺮﺑﻊ ﺷﻜﻞ ﻛﻮﭼﻚ )ﻣﺎﻧﻨﺪ ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ (8*8ﺗﺒﺪﻳﻞ ﻣﻲﺷﻮﻧﺪ .ﺑﻨﺎ ﺑﺮ اﻳﻦ
ﻋﺒﺎرت زﻳﺮ
)'y = blkproc(x, [8 8], 'P1 * x * P2', h, h
ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ ﺗﺼﻮﻳﺮ xرا در ﻗﻄﻌﺎت 8*8ﺑﺎ اﺳﺘﻔﺎده از ﻣﺎﺗﺮﻳﺲ ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ hاﻧﺠﺎم ﻣﻲدﻫﺪ و ﺟﺎﺑﺠﺎﻳﻲ hﺑﻪ ﺻﻮرت
ﺑﺮاي ﻧﺎﻓﺸﺮده ﻛﺮدن ﺗﺼﻮﻳﺮ im2jpegﻗﻄﻌﺎت ﺑﺎﻳﺪ ﭘﺮدازش و ﺑﺮ اﺳﺎس ﻣﺎﺗﺮﻳﺲ ﺗﺒﺪﻳﻞ ﺷﻮﻧﺪ .ﺗﺎﺑﻊ jpeg2imﻋﻤﻠﻴﺎت ﻣﻌﻜﻮسﺳﺎزي را )ﺑﻪ
)function x= jpeg2im(y
%JPEG2IM Decode an IM2JPEG compressed image.
% X = JPEG2IM(Y) decodes compresses image Y, generationg
% reconstructed approximation X. Y is a structure generated by
% IM2JPEG
%
41
% See also IM2JPEG.
error(nargchk(1, 1, nargin)); % Check input arguments
order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 …
41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 …
43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 …
45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 …
62 63 56 64 ];
rev = order; % Compute inverse ordering
for k = 1:length(r=order)
rev(k) = find(order == k);
end
m = double(y.quality) / 100 * m; % Get encoding quality.
Xb = double(y.numblocks) % Get x blocks.
sz = double(y.size);
xn = sz(2); % Get x columns.
xm = sz(1); % Get x rows.
x = huff2mat(y.huffman); % Huffman decode.
eob = max(x(:)); % Get end-of-block symbol
z = zeros(64, xb); k = 1; % Form block columns by copying
for j = 1:xb % successive values from x into
for i = 1:64 % columns of z, while changing
if x(k) == eob % to the next column whenever
k = k + 1: break; % an EOB symbol is found.
else
z(i, j) = x(k);
k = k + 1;
end
end
end
ﺗﺼﻮﻳﺮ ﺑﺎزﺳﺎزي ﺷﺪه اﺳﺖ از ﺗﺎﺑﻌﻬﺎي8*8 ﻋﻨﺼﺮي ﻳﻚ ﻗﻄﻌﻪ64 ﻛﻪ ﻫﺮ ﻳﻚ از ﺳﺘﻮﻧﻬﺎيz ﺑﻌﺪي از ﺳﺘﻮﻧﻬﺎي ﻣﺎﺗﺮﻳﺲ2 ﺑﺮاي ﺑﺎز ﻳﻚ ﺗﺼﻮﻳﺮ
اﺑﻌﺎدmm, mn, ﺗﻌﺮﻳﻒ ﺷﺪهاﻧﺪ در ﺣﺎﻟﻲ ﻛﻪ آراﻳﻪim2col ﻗﺒﻼٌ ﺑﺮاي ﺗﺎﺑﻊA,B,[M,N], distinct ﭘﺎراﻣﺘﺮﻫﺎي.ﻋﻤﻮﻣﻲ اﺳﺘﻔﺎده ﻣﻲﻛﻨﺪ
42
ﻣﺜﺎل :6.8
در ﺗﺼﺎوﻳﺮ (a)6.13و ) 2 ,(bﺗﺼﻮﻳﺮ رﻣﺰﮔﺬاري ﺷﺪه و رﻣﺰﮔﺸﺎﻳﻲ ﺷﺪه ﺑﺎ jpegو ﻣﻘﺎدﻳﺮ ﺗﻘﺮﻳﺒﻲ ﺗﺼﻮﻳﺮ ﺗﻚ رﻧﮓ (a)6.4دﻳﺪه ﻣﻲﺷﻮﻧﺪ.
ﻧﺴﺒﺖ ﻓﺸﺮدهﺳﺎزي ﻧﺘﻴﺠﻪ اول 18ﺑﻪ 1اﺳﺖ ﺑﺎ اﺟﺮاي ﻣﺴﺘﻘﻴﻢ آراﻳﻪ ﻫﻨﺠﺎرﺳﺎزي در ﺗﺼﻮﻳﺮ (a)6.12ﺑﻪ دﺳﺖ آﻣﺪ.
دوﻣﻴﻦ ﻣﻮرد ﻛﻪ ﺗﺼﻮﻳﺮ اﺻﻠﻲ را ﺑﻪ ﻧﺴﺒﺖ 42ﺑﻪ 1ﻓﺸﺮدهﺳﺎزي ﻛﺮده اﺳﺖ ﺑﺎ ﺿﺮب ﻛﺮدن آراﻳﻪ ﻫﻨﺠﺎرﺳﺎزي در 4اﻳﺠﺎد ﺷﺪ.
اﺧﺘﻼف ﺑﻴﻦ ﺗﺼﻮﻳﺮ اﺻﻠﻲ ﻋﻜﺲ (a)6.4و ﺗﺼﻮﻳﺮ ﺑﺎزﺳﺎزي ﺷﺪه ﻋﻜﺲ (a)6.13و) (bدر ﺗﺼﻮﻳﺮﻫﺎي (c)6.13و) (dﺑﻪ ﺗﺮﺗﻴﺐ ﻧﺸﺎن داده ﺷﺪه
اﺳﺖ .ﻫﺮ دو ﺗﺼﻮﻳﺮ ﺑﺮاي ﻧﻤﺎﻳﺶ ﺑﻬﺘﺮ ﺧﻄﺎﻫﺎ ﻣﻘﻴﺎس ﺑﻨﺪي ﺷﺪهاﻧﺪ.
ﺗﺎﺛﻴﺮ اﻳﻦ ﺧﻄﺎﻫﺎ ﺑﺮ ﻛﻴﻔﻴﺖ ﺗﺼﻮﻳﺮ در ﺗﺼﻮﻳﺮﻫﺎي ﺑﺰرﮔﻨﻤﺎﻳﻲ ﺷﺪه (e)6.13و ) (fﺑﻪ ﺧﻮﺑﻲ ﻣﺸﻬﻮد اﺳﺖ.
اﻳﻦ ﺗﺼﻮﻳﺮﻫﺎ ﺑﻪ ﺗﺮﺗﻴﺐ ﻗﺴﻤﺘﻬﺎي ﺑﺰرگ ﺷﺪه ﻋﻜﺴﻬﺎي (a)6.13و ) (bﻫﺴﺘﻨﺪ و ﺑﻬﺘﺮ ﻣﻲﺗﻮان اﺧﺘﻼﻓﻬﺎي ﻇﺮﻳﻒ ﺑﻴﻦ ﺗﺼﻮﻳﺮﻫﺎي ﺑﺎزﺳﺎزي
ﺷﺪه را ارزﻳﺎﺑﻲ ﻛﺮد .ﺗﺼﻮﻳﺮ اﺻﻠﻲ ﺑﺰرگ ﺷﺪه در ﺗﺼﻮﻳﺮ (b)6.4دﻳﺪه ﻣﻲﺷﻮد.
ﺑﻪ اﺑﺰار ﻗﻄﻌﻪﺑﻨﺪي ﻛﻪ در ﺗﺼﻮﻳﺮﻫﺎي ﺑﺰرگ ﺷﺪه دﻳﺪه ﻣﻲﺷﻮد ﺗﻮﺟﻪ ﻛﻨﻴﺪ.
ﺗﺼﻮﻳﺮﻫﺎي ﻋﻜﺲ 6.13و ﻧﺘﺎﻳﺞ ﻓﻮق ﺑﺎ ﻓﺮﻣﺎﻧﻬﺎي زﻳﺮ ﺑﻪ دﺳﺖ آﻣﺪه اﺳﺖ:
;)'>> f = imread(Tracy.tif
;)>> c1 = im2jpeg(f
;)>> f1 = jpeg2im(c1
)>> imratio(f, c1
= ans
18.2450
)>> compare(f, f1, 3
= ans
2.4675
;)>> c4 = im2jpeg(f, 4
;)>> f4 = jpeg2im(c4
)>> imratio(f, c4
= ans
41.7826
)>> compare(f, f4, 3
= ans
4.4184
43
ﺗﺼﻮﻳﺮ :6.13ﺳﺘﻮن ﭼﭗ ﺳﺎﺧﺖ ﺗﺼﻮﻳﺮ ﺗﻘﺮﻳﺒﻲ ﻋﻜﺲ 6.4ﺑﺎ اﺳﺘﻔﺎده از ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ و آراﻳﻪ ﻫﻨﺠﺎرﺳﺎزي ﺗﺼﻮﻳﺮ ﺳﻤﺖ راﺳﺖ:
44
اﻳﻦ ﻧﺘﺎﻳﺞ ﺑﺎ ﻧﺘﺎﻳﺞ ﺑﻪ دﺳﺖ آﻣﺪه در ﻣﺤﻴﻂ رﻣﺰﮔﺬاري ﻣﺒﻨﺎي jpegﺗﻔﺎوت دارد زﻳﺮا im2jpegﻣﺤﺼﻮﻟﻲ اﻳﺠﺎد ﻣﻲﻛﻨﺪ ﻛﻪ ﺷﺒﻴﻪ ﺑﻪ
) (1ﻛﻠﻴﻪ دﻓﻌﺎت اﺟﺮاي ﺻﻔﺮﻫﺎي ﺿﺮﻳﺐ در ﺣﺎﻟﺖ اﺳﺘﺎﻧﺪارد داراي رﻣﺰﮔﺬاري ﻫﺎﻓﻤﻦ ﻫﺴﺘﻨﺪ در ﺣﺎﻟﻲ ﻛﻪ im2jpegﻓﻘﻂ اﺟﺮاي آﺧﺮ ﻫﺮ
) (2رﻣﺰﮔﺬاري و رﻣﺰﮔﺸﺎﻳﻲ ﺣﺎﻟﺖ اﺳﺘﺎﻧﺪارد ﺑﺮ اﺳﺎس رﻣﺰ ﭘﻴﺶ ﻓﺮض ﻫﺎﻓﻤﻦ اﺳﺖ در ﺣﺎﻟﻲ ﻛﻪ im2jpegاﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﺑﺎزﺳﺎزي
ﺗﺼﻮﻳﺮ ﺑﺎ ﻛﺪ ﻫﺎﻓﻤﻦ را در ﻣﺒﻨﺎي ﺗﺼﻮﻳﺮ ﻗﺮار ﻣﻲدﻫﺪ .ﻧﺴﺒﺖ ﻓﺸﺮدهﺳﺎزي ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ اﺳﺘﺎﻧﺪارد 2ﺑﺮاﺑﺮ ﻣﻲﺷﻮد.
ﭘﺴﻮﻧﺪ ﻓﻮق ﻫﻤﭽﻮن ﭘﺴﻮﻧﺪ jpegﻣﻌﻤﻮﻟﻲ ﺑﺮ اﺳﺎس اﻳﻦ اﺳﺘﺪﻻل اﺳﺖ ﻛﻪ ﺿﺮاﻳﺐ ﺗﺒﺪﻳﻞ ﻛﻪ ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي را ارﺗﺒﺎطزداﻳﻲ ﻣﻲﻛﻨﻨﺪ ﻣﻮﺛﺮﺗﺮ
از ﻋﻨﺎﺻﺮ اﺻﻠﻲ ﻗﺎﺑﻞ رﻣﺰﮔﺬاري ﻫﺴﺘﻨﺪ .اﮔﺮ ﺗﺎﺑﻌﻬﺎي ﻣﺒﻨﺎي ﺗﺒﺪﻳﻞ ﻛﻪ اﻣﻮاج ﻛﻮﭼﻜﻲ در jpeg2000ﻫﺴﺘﻨﺪ اﻛﺜﺮ اﻃﻼﻋﺎت ﺗﺼﻮﻳﺮي ﻣﻬﻢ را
ﺑﻪ ﺗﻌﺪاد ﻣﺤﺪودي از ﺿﺮاﻳﺐ ﻓﺸﺮده ﻛﻨﻨﺪ ﻣﺎﺑﻘﻲ ﺿﺮاﻳﺐ ﺑﺎ داﻧﻪﻫﺎي درﺷﺖ ﻛﻤﻲ ﺳﺎزي ﻣﻲﺷﻮﻧﺪ و ﺑﺎ اﻧﺪﻛﻲ ﺗﺤﺮﻳﻒ ﺗﺼﻮﻳﺮ ﺑﻪ ﺻﻔﺮ ﺑﺮﻳﺪه
ﻣﻲﺷﻮﻧﺪ.
ﻳﻚ ﺳﻴﺴﺘﻢ رﻣﺰﮔﺬاري ﺳﺎده ﺷﺪه jpeg2000در ﺗﺼﻮﻳﺮ 6.14ﻧﺸﺎن داده ﺷﺪه اﺳﺖ .اوﻟﻴﻦ ﻣﺮﺣﻠﻪ رﻣﺰﮔﺬاري اﻧﺘﻘﺎل ﻋﻨﺎﺻﺮ ﺗﺼﻮﻳﺮي ﺑﺎ ﻛﻢ
ﻛﺮدن 2m-1اﺳﺖ ﻛﻪ در اﻳﻨﺠﺎ 2mﺗﻌﺪاد ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي) (gray_levelﺗﺼﻮﻳﺮ اﺳﺖ .ﺗﺒﺪﻳﻞ ﻣﺘﻤﺎﻳﺰ ﺗﻚ ﺑﻌﺪي ردﻳﻔﻬﺎ و ﺳﺘﻮﻧﻬﺎي ﺗﺼﻮﻳﺮ
ﺗﺒﺪﻳﻞ اﺳﺘﻔﺎده ﺷﺪه در ﻓﺸﺮدهﺳﺎزي ﺑﺪون ﺧﻄﺎ دوﻣﺘﻌﺎﻣﺪي اﺳﺖ .ﻛﻪ ﻣﻘﻴﺎس ﺑﻨﺪي ﺿﺮاﻳﺐ 3-5و ﺑﺮداري از اﻣﻮاج ﻛﻮﭼﻚ دارد .در
ﺑﺮﻧﺎﻣﻪﻫﺎﻳﻲ ﻛﻪ اﺗﻼف اﻃﻼﻋﺎت دارﻳﻢ از ﺑﺮداري ﺑﺎ ﻣﻘﻴﺎس ﺑﻨﺪي ﺿﺮﻳﺐ 7-9اﺳﺘﻔﺎده ﻣﻲﺷﻮد )ﺑﻪ ﺗﺎﺑﻊ wavefilterﻓﺼﻞ 7ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ( .ﺑﻪ
45
ﻫﺮ ﺣﺎل ﺗﺠﺰﻳﻪ اوﻟﻴﻪ ﻣﻨﺠﺮ ﺑﻪ اﻳﺠﺎد 4ﻣﻘﻮﻟﻪ ﻓﺮﻋﻲ ﻣﻲﺷﻮد :ﺷﺒﻴﻪ ﺳﺎزي ﺗﺼﻮﻳﺮ ﺑﺎ ﺗﻔﻜﻴﻚ ﭘﺬﻳﺮي ﭘﺎﻳﻴﻦ ،و ﺧﺼﻮﺻﻴﺎت ﻓﺮﻛﺎﻧﺲ اﻓﻘﻲ ،ﻋﻤﻮدي
و ارﻳﺐ ﺗﺼﻮﻳﺮ.
اﮔﺮ ﻓﺮاﻳﻨﺪ ﺗﺠﺰﻳﻪ NLدﻓﻌﻪ ﺗﻜﺮار ﺷﻮد ،و ﺗﻜﺮارﻫﺎي ﺑﻌﺪي ﻣﺤﺪود ﺑﻪ ﺿﺮﻳﺒﻬﺎي ﺗﺠﺰﻳﻪﮔﺮ ﻗﺒﻞ ﺑﺎﺷﺪ ﻳﻚ ﺗﺒﺪﻳﻞ ﺑﺎ ﻣﻘﻴﺎس NLﺗﻮﻟﻴﺪ ﻣﻲﺷﻮد.
ﻣﻘﻴﺎﺳﻬﺎي ﻣﺠﺎور ﺑﺎ ﺗﻮان 2ﻣﺮﺗﺒﻂ ﻣﻲﺷﻮﻧﺪ و ﭘﺎﻳﻴﻨﺘﺮﻳﻦ ﻣﻘﻴﺎس ﻧﻮع ﺗﻌﺮﻳﻒ ﺷﺪه ﺗﺼﻮﻳﺮ اﺻﻠﻲ را دارد .ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﺗﺼﻮﻳﺮ 6.15ﺣﺪس
زده ﻣﻲﺷﻮد ،ﻧﺸﺎﻧﻪﮔﺬاري اﺳﺘﺎﻧﺪارد در ﻣﻮرد NL =2ﺧﻼﺻﻪ ﺷﺪه اﺳﺖ و ﻳﻚ ﻣﻘﻴﺎس ﺗﺒﺪﻳﻞ ﻋﻤﻮﻣﻲ NLو 3 NL +1واﺣﺪ ﻓﺮﻋﻲ دارد ﻛﻪ
ﺿﺮاﻳﺐ آن ﺑﺎ abﻧﺸﺎن داده ﺷﺪه اﺳﺖ .در اﻳﻦ اﺳﺘﺎﻧﺪارد ﺗﻌﺪاد ﻣﻘﻴﺎسﻫﺎي ﻣﺤﺎﺳﺒﻪ ﺷﺪه ﻣﺸﺨﺺ ﻧﻤﻲﺷﻮد.
ﭘﺲ از ﻣﺤﺎﺳﺒﻪ ﺗﺒﺪﻳﻞ ﻣﻮﺟﻲ ﻣﻘﻴﺎس NLﻛﻞ ﺗﻌﺪاد ﺿﺮاﻳﺐ ﺗﺒﺪﻳﻞ ﻣﻌﺎدل ﺗﻌﺪاد ﻧﻤﻮﻧﻪﻫﺎي ﺗﺼﻮﻳﺮ اﺻﻠﻲ اﺳﺖ وﻟﻲ اﻃﻼﻋﺎت ﺗﺼﻮﻳﺮي اﺻﻠﻲ
در ﭼﻨﺪ ﺿﺮﻳﺐ ﻣﺘﻤﺮﻛﺰ ﺷﺪه اﺳﺖ .ﺑﺮاي ﻛﺎﻫﺶ ﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﻤﺎﻳﺶ آﻧﻬﺎ ﺿﺮﻳﺐ ) ab(u, vﺑﺎﻧﺪ ﻓﺮﻋﻲ bﺑﻪ ﻣﻘﺪار ) qb(u, vﺑﺎ
؟
در اﻳﻨﺠﺎ ﻋﻤﻠﮕﺮﻫﺎي " "signو " "floorﻫﻤﭽﻮن ﺗﺎﺑﻌﻬﺎي ﻫﻢ اﺳﻢ ﻧﺮم اﻓﺰار MATLABﻫﺴﺘﻨﺪ .در اﻳﻦ ﻣﺮﺣﻠﻪ ﻛﻤﻲ ﺳﺎزي ،اﻧﺪازه ∆b
؟
Rbﺣﻴﻄﻪ اﺳﻤﻲ ﭘﻮﻳﺎي ﺑﺎﻧﺪ ﻓﺮﻋﻲ bاﺳﺖ و εb , µ bﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﺗﺨﺼﻴﺺ داده ﺷﺪه ﺑﻪ ﻧﻤﺎ و ﺟﺰء اﻋﺸﺎري ﻟﮕﺎرﻳﺘﻢ ﺿﺮاﻳﺐ ﺑﺎﻧﺪ ﻓﺮﻋﻲ
ﻫﺴﺘﻨﺪ .ﺣﻴﻄﻪ ﭘﻮﻳﺎي ﺑﺎﻧﺪ ﻓﺮﻋﻲ bﻣﺠﻤﻮع ﺑﻴﺘﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﻤﺎﻳﺶ ﺗﺼﻮﻳﺮ اﺻﻠﻲ و ﺗﺤﻠﻴﻞ ﺑﺎﻧﺪ ﻓﺮﻋﻲ bاﺳﺖ.
46
ﺗﺤﻠﻴﻞ ﺑﻴﺘﻬﺎي ﺑﺎﻧﺪ ﻓﺮﻋﻲ ﻣﻄﺎﺑﻖ ﺑﺎ اﻟﮕﻮي ﺳﺎده ﺗﺼﻮﻳﺮ 6.15اﺳﺖ .ﻣﺜﻼً در ﺑﺎﻧﺪ ﻓﺮﻋﻲ b=1HHدو ﺗﺤﻠﻴﻞ ﺑﻴﺘﻲ وﺟﻮد دارد.
ﺑﺮاي ﻓﺸﺮدهﺳﺎزي ﺑﺪون ﺧﻄﺎ µ b =0و Rb=εbﻛﻪ در ﻧﺘﻴﺠﻪ ∆ b =1اﺳﺖ .در ﻓﺸﺮدهﺳﺎزيﻫﺎي ﺑﺮﮔﺸﺖﻧﺎﭘﺬﻳﺮ ﻫﻴﭻ ﻣﺮﺣﻠﻪ ﻛﻤﻲ ﺳﺎزي
ﺧﺎﺻﻲ ﻣﺸﺨﺺ ﻧﻤﻲﺷﻮد .در ﻋﻮض ﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﺟﺰء اﻋﺸﺎري ﻟﮕﺎرﻳﺘﻢ و ﻧﻤﺎ ﺑﺮ اﺳﺎس ﺑﺎﻧﺪ ﻓﺮﻋﻲ ﺑﻪ ﻧﺎم ﻛﻤﻲ ﺳﺎزي ﻋﻠﻨﻲ در اﺧﺘﻴﺎر رﻣﺰﮔﺸﺎ
ﻗﺮار داده ﻣﻲﺷﻮد و ﻳﺎ ﻓﻘﻂ ﺑﺮ اﺳﺎس ﺑﺎﻧﺪ ﻓﺮﻋﻲ NLLLﺑﺎ ﻋﻨﻮان ﻛﻤﻲ ﺳﺎزي ﻧﻬﻔﺘﻪ )(implicit quantizationاﻧﺠﺎم ﻣﻲﺷﻮد .در ﻣﻮرد
دوم ،ﻣﺎﺑﻘﻲ ﺑﺎﻧﺪﻫﺎي ﻓﺮﻋﻲ ﺑﺎ اﺳﺘﻔﺎده از ﭘﺎراﻣﺘﺮﻫﺎي ﺑﺎﻧﺪ ﻓﺮﻋﻲ NLLLﻛﻤﻲ ﺳﺎزي ﻣﻲﺷﻮﻧﺪ .ﻓﺮض ﻛﻨﻴﺪ , µ0 ε 0ﺗﻌﺪاد ﺑﻴﺘﻬﺎي ﺗﺨﺼﻴﺺ
داده ﺷﺪه ﺑﻪ ﺑﺎﻧﺪ ﻓﺮﻋﻲ NLLLﻫﺴﺘﻨﺪ .ﭘﺎراﻣﺘﺮﻫﺎي درون ﻳﺎﺑﻲ ﺷﺪه ﺑﺎﻧﺪ ﻓﺮﻋﻲ ب ﺑﻪ ﺷﺮح زﻳﺮ اﺳﺖ:
؟
در اﻳﻨﺠﺎ nsdbﺗﻌﺪاد ﺳﻄﻮح ﺗﺠﺰﻳﻪ ﺑﺎﻧﺪ ﻓﺮﻋﻲ از ﺗﺼﻮﻳﺮ اﺻﻠﻲ ﻧﺴﺒﺖ ﺑﻪ ﺑﺎﻧﺪ ﻓﺮﻋﻲ bاﺳﺖ.
در ﻣﺮﺣﻠﻪ ﻧﻬﺎﻳﻲ رﻣﺰﮔﺬاري ﺿﺮاﻳﺐ ﻛﻤﻲ ﺳﺎزي ﺷﺪه ﺑﺮ اﺳﺎس اﺻﻮل رﻳﺎﺿﻲ رﻣﺰﮔﺬاري ﻣﻲﺷﻮﻧﺪ .ﮔﺮﭼﻪ رﻣﺰﮔﺬاري رﻳﺎﺿﻲ ) aritmetic
(codingدر اﻳﻦ ﻓﺼﻞ ﺑﺮرﺳﻲ ﻧﺸﺪه اﺳﺖ وﻟﻲ ﻳﻚ روش رﻣﺰﮔﺬاري ﺑﺎ ﻃﻮل ﻣﺘﻐﻴﺮ اﺳﺖ ﻛﻪ ﻫﻤﭽﻮن رﻣﺰﮔﺬاري ﻫﺎﻓﻤﻦ ﺑﺮاي ﻛﺎﻫﺶ اﻓﺰوﻧﮕﻲ
ﺗﺎﺑﻊ ﺳﻔﺎرﺷﻲ im2jpeg2kﻓﺮاﻳﻨﺪي ﺷﺒﻴﻪ ﺑﻪ رﻣﺰﮔﺬاري jpeg2000در ﺗﺼﻮﻳﺮ (a)6.14دارد .ﺗﻨﻬﺎ اﺳﺘﺜﻨﺎ رﻣﺰﮔﺬاري ﻧﻤﺎدﻳﻦ رﻳﺎﺿﻲ اﺳﺖ.
ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﻓﻬﺮﺳﺖ زﻳﺮ دﻳﺪه ﻣﻲﺷﻮد رﻣﺰﮔﺬاري ﻫﺎﻓﻤﻦ ﻛﻪ ﺑﺎ رﻣﺰﮔﺬاري ﺻﻔﺮ ﺗﻘﻮﻳﺖ ﺷﺪه ﺟﺎﻳﮕﺰﻳﻦ ﺣﺎﻟﺖ ﺳﺎده ﺷﺪه اﺳﺖ.
)function y = im2jpeg2k(x, n, q
%IM2JPEG Compresses an image using a 2000 approximation.
% Y = IM2JPEG2K(X, N, Q) Compresses image X using an N-scale JPEG
% 2k wavelet transform, implicit or explicit coefficient
% quantization, and Huffman symbol coding augmented by zero
% run-length coding. If quantization vector Q contains two
% elements, they are assumed to be implicit quantization
% parameters; else, it is assumed to contain explicit subband step
% size. Y is an encoding structure containing Huffman-encoded
% data and additional parameters needed by JPEG2K2IM for decoding.
%
% See also JPEG2K2IM.
global RUNS
;))error(nargchk(3, 3, nargin % Check input arguments
)'if nargin(x) ~= 2 | ~isreal(x) | ~isnumeric(x) | ~isa(x, 'uint8
;)'error('The input must be a UINT8 image.
end
if length(q) ~= 2 & length(q) ~= 3 * n + 1
;)'error('The quantization step size vector is bad.
end
% Level shift the input and compute its wavelet transform.
;x = double(x) – 128
;)'[c, s] = wavefast(x, n, 'jpeg.7
% Quantize the wavelet coefficients.
;)q = stepsize(n, q
;)sgn = sign(c ;sgn(find(sgn == 0) = 1 ;)c = abs(c
47
for k = 1:n
qi = 3* k – 2;
c = wavepaste('h', c, s, k, wavecopy('h', c, s, k) / q(qi));
c = wavepaste('v', c, s, k, wavecopy('v', c, s, k) / q(qi+1));
c = wavepaste('d', c, s, k, wavecopy('d', c, s, k) / q(qi+2));
end
c = wavepaste('a', c, s, k, wavecopy('a', c, s, k) / q(qi+3));
c = floor(c);
% Find the run transition points: 'plus' contains the index of the
% start of a zero run; the corresponding 'minus' is its end + 1.
z = c == 0; z = z – [0 z(1:end – 1)];
plus = find(z == 1); minus = find(z == -1);
% Remove all other zero runs (based on 'plus' and 'minus') from 'c'.
for i = length(minus):-1:1
run = minus(i) – plus(i);
if run > 0
ovrflo = floor(run / 65535); run = run – ovrflo * 65535;
c = [c(1:plus(i) – 1) repmat([zrc 1], 1, ovrflo) zrc …
runcode(run) c(minus(i):end)];
end
end
%----------------------------------------------------------------------------------
----%
function y = runcode(x)
% Find a zero run in the run-length table. If not found, create a
% new entry in the table. Return the index of the run.
global RUNS
y = find(RUNS == x);
if length(y) ~= 1
RUNS = [RUNS; x];
y = length(RUNS);
end
%----------------------------------------------------------------------------------
----%
function q = stepsize(n, p)
% Create a subband quantization array of step ordered by
% decomposition (first to last) and subband (horizontal, vertical),
48
% diagonal, and for final decomposition the approximation subband).
if length(p) == 2 % Implicit Quantization
q = [ ];
qn = 2 ^ (8 – p(2) + n) * (1 + p(1) / 2 ^ 11);
for k = 1:n
qk = 2 ^ - k * qn;
q = [q (2 * qk) (2 * qk) (4 * qk)];
end
q = [q qk];
else % Explicit Quantization
q = p;
end
ﭘﺲ از رﻣﺰﮔﺸﺎﻳﻲ اﻳﻦ ﺿﺮاﻳﺐ رﻳﺎﺿﻲ ﺑﺎﻧﺪﻫﺎي ﻓﺮﻋﻲ ﺗﺼﻮﻳﺮ اﺻﻠﻲ. ﺻﺮﻓﺎً روﻧﺪ ﻋﻤﻠﻴﺎت ﻓﻮق را ﻣﻌﻜﻮس ﻣﻲﻛﻨﻨﺪjpeg2000 رﻣﺰﮔﺸﺎﻫﺎي
را ﺑﺮاي ﺑﺎﻧﺪﻫﺎي ﻓﺮﻋﻲ ﺧﺎﺻﻲ رﻣﺰﮔﺬاري ﻣﻲﻛﻨﺪ وﻟﻲ ﻛﺎرﺑﺮ ﻣﻤﻜﻦ اﺳﺖ ﺑﺎMb ﮔﺮﭼﻪ اﻳﻦ رﻣﺰﮔﺬار ﺑﻴﺘﻬﺎي.ﻣﻨﺘﺨﺐ ﻛﺎرﺑﺮ ﺑﺎزﺳﺎزي ﻣﻲﺷﻮﻧﺪ
2 Mb- . ∆b ﺑﺮاي اﻳﻦ ﻛﺎر ﺿﺮاﻳﺐ ﺑﺎ اﺳﺘﻔﺎده از ﻣﺮﺣﻠﻪ. ﺧﺎﺻﻲ ﺑﮕﻴﺮدNb ﺗﻮﺟﻪ ﺑﻪ ﺟﺮﻳﺎﻧﻬﺎي ﺗﻌﺒﻴﻪ ﺷﺪه ﻓﻘﻂ ﺗﺼﻤﻴﻢ ﺑﻪ رﻣﺰﮔﺸﺎﻳﻲ ﺑﻴﺘﻬﺎي
. ﺑﻴﺘﻬﺎي رﻣﺰﮔﺸﺎﻳﻲ ﻧﺸﺪه ﺻﻔﺮ ﻣﻲﺷﻮﻧﺪ و ﺿﺮاﻳﺐ ﺣﺎﺻﻞ از آن ﺑﺎ اﺳﺘﻔﺎده از راﺑﻄﻪ زﻳﺮ ﻫﻨﺠﺎرزداﻳﻲ ﻣﻲﺷﻮﻧﺪ.ﻛﻤﻲ ﺳﺎزي ﻣﻲﺷﻮﻧﺪNb
ﺳﭙﺲ ﺿﺮاﻳﺐ ﻫﻨﺠﺎرزداﻳﻲ ﺷﺪه ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس ﺗﺒﺪﻳﻞ ﻣﻲﺷﻮﻧﺪ و ﺟﺎﺑﺠﺎ ﻣﻴﺸﻮﻧﺪ ﺗﺎ ﻣﺤﺼﻮﻟﻲ ﺷﺒﻴﻪ ﺑﻪ ﺗﺼﻮﻳﺮ اﺻﻠﻲ. اﺳﺖqb(u, v)
. را ﻣﻌﻜﻮس ﻣﻲﻛﻨﺪim2jpeg2k ﺷﺒﻴﻪ اﻳﻦ روﻧﺪ را اﻳﺠﺎد ﻣﻲﻛﻨﺪ و ﻓﺸﺮدهﺳﺎزيjpeg2k2im ﺗﺎﺑﻊ ﺳﻔﺎرﺷﻲ.ﺣﺎﺻﻞ ﺷﻮد
function x = jpeg2k2im(y)
%JPEG2K2IM Decoded an IM2JPEG2K compressed image.
% X = JPEG2K2IM(Y) decoded compresses image Y, reconstructing an
% structure returned by IM2JPEG2K.
%
% See also IM2JPEG2K.
error(nargchk(1, 1, nargin)); % Check input arguments
% Get decoding parameters: scale, quantization vector, run-length
% table size, zero run code, end-of-data code, wavelet bookkeeping
% array, and run-length table.
n = double(y.n);
q = double(y.q) / 100;
runs = double(y.runs);
rlen = length(runs);
49
;)zrc = -double(y.zrc
;eoc = zrc – 1
;)s = reshape(s, n + 2, 2
اﺧﺘﻼف اﺻﻠﻲ ﺑﻴﻦ ﺳﻴﺴﺘﻢ ﻣﺒﺘﻨﻲ ﺑﺮ اﻣﻮاج ﻛﻮﭼﻚ در ﺗﺼﻮﻳﺮ 6.14و ﺳﻴﺴﺘﻢ jpegﻣﺒﺘﻨﻲ ﺑﺮ ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ در ﺗﺼﻮﻳﺮ 6.11
ﺣﺬف ﻣﺮاﺣﻞ ﭘﺮدازش ﺗﺼﻮﻳﺮ ﻓﺮﻋﻲ اﺳﺖ .از آﻧﺠﺎﺋﻲ ﻛﻪ ﺗﺒﺪﻳﻠﻬﺎي اﻣﻮاج ﻛﻮﭼﻚ از ﻧﻈﺮ ﻣﺤﺎﺳﺒﺎﺗﻲ ﻣﻮﺛﺮ و ذاﺗﺎٌ ﻣﻮﺿﻌﻲ ﻫﺴﺘﻨﺪ )ﻳﻌﻨﻲ ﻋﻤﻠﻜﺮد
اﺳﺎﺳﻲ آﻧﻬﺎ ﻣﺪت ﻣﺤﺪود دارد( ﻧﻴﺎزي ﺑﻪ ﺗﻘﺴﻴﻢ ﺗﺼﻮﻳﺮ ﺑﻪ ﻗﻄﻌﺎت ﻛﻮﭼﻜﺘﺮ ﻧﻴﺴﺖ .ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﻣﺜﺎل زﻳﺮ ﻣﻲﺑﻴﻨﻴﻢ ،ﺣﺬف ﻣﺮﺣﻠﻪ ﺗﻘﺴﻴﻢ
ﺑﺎﻋﺚ ﺣﺬف اﺑﺰار ﻗﻄﻌﻪ ﺑﻨﺪي ﻣﻲﺷﻮد ﻛﻪ در ﻧﺴﺒﺘﻬﺎي ﻓﺸﺮدهﺳﺎزي ﺑﺎﻻ ﺧﺼﻮﺻﻴﺎﺗﻲ ﺷﺒﻴﻪ ﺑﻪ ﺗﺒﺪﻳﻞ ﻛﺴﻴﻨﻮﺳﻲ ﻣﺘﻤﺎﻳﺰ اﻳﺠﺎد DCTﻣﻲﻛﻨﺪ.
دو ﻧﻮع ﺷﺒﻴﻪ ﺳﺎزي ﺧﺼﻮﺻﻴﺎت ﺗﺼﻮﻳﺮ ﺗﻚ رﻧﮓ (a)6.4در ﺗﺼﻮﻳﺮ 6.16دﻳﺪه ﻣﻲﺷﻮد .ﺗﺼﻮﻳﺮ (a)6.16از رﻣﺰﮔﺬاري ﺑﺎزﺳﺎزي ﺷﺪ ﻛﻪ ﺗﺼﻮﻳﺮ
اﺻﻠﻲ را ﺑﻪ ﻧﺴﺒﺖ 42ﺑﻪ 1ﻓﺸﺮده ﻛﺮده ﺑﻮد .ﺗﺼﻮﻳﺮ (b)6.16از رﻣﺰﮔﺬاري 88:1اﻳﺠﺎد ﺷﺪ .اﻳﻦ دو ﻧﺘﻴﺠﻪ ﺑﺎ اﺳﺘﻔﺎده از ﺗﺒﺪﻳﻞ 5ﻣﻘﻴﺎﺳﻲ و
µ 0=8.5ﺑﻪ دﺳﺖ آﻣﺪ .از آﻧﺠﺎﺋﻲ ﻛﻪ im2jpeg2kﻓﻘﻂ رﻣﺰﮔﺬاري ﺷﺒﻴﻪ ﺑﻪ jpeg2000اﻳﺠﺎد ﻣﻲﻛﻨﺪ ،ﻧﺴﺒﺘﻬﺎي ﻓﺸﺮدهﺳﺎزي ﻗﻴﺪ ﺷﺪه
ﻓﻘﻂ ﺑﺎ ﻧﺴﺒﺘﻬﺎي رﻣﺰﮔﺬاري واﻗﻌﻲ jpeg2000ﺗﻔﺎوت دارﻧﺪ .در واﻗﻊ ﻧﺴﺒﺘﻬﺎي واﻗﻌﻲ 2ﺑﺮاﺑﺮ اﻓﺰاﻳﺶ ﻣﻲﻳﺎﺑﺪ.
50
از آﻧﺠﺎﺋﻲ ﻛﻪ ﻓﺸﺮدهﺳﺎزي 42:1ﻧﺘﺎﻳﺞ در ﺳﺘﻮن ﺳﻤﺖ ﭼﭗ ﺗﺼﻮﻳﺮ 6.16ﻫﻤﺎﻧﻨﺪ ﻓﺸﺮدهﺳﺎزي ﺗﺤﻘﻖ ﻳﺎﻓﺘﻪ در ﺳﺘﻮن ﺳﻤﺖ راﺳﺖ ﺗﺼﻮﻳﺮ
6.13اﺳﺖ )ﻣﺜﺎل (6.8ﺗﺼﻮﻳﺮﻫﺎي c ،e.6.16از ﻧﻈﺮ ﻛﻴﻔﻲ و ﻛﻤﻲ ﺑﺎ ﻧﺘﺎﻳﺞ ﺗﺒﺪﻳﻞ ﺗﺼﻮﻳﺮﻫﺎي d ،b 6.13و fﻗﺎﺑﻞ ﻗﻴﺎس ﻫﺴﺘﻨﺪ .ﺑﻌﺪ از
ﻣﻘﺎﻳﺴﻪ اﻳﻦ ﺗﺼﺎوﻳﺮ ﻛﺎﻫﺶ ﭼﺸﻤﮕﻴﺮ ﺧﻄﺎ در ﺗﺼﻮﻳﺮﻫﺎي jpeg2000دﻳﺪه ﻣﻲﺷﻮد .در واﻗﻊ ﺧﻄﺎي rmsﻧﺘﺎﻳﺞ ﻣﺒﺘﻨﻲ ﺑﺮ jpeg2000در
ﺗﺼﻮﻳﺮ (a).6.16در ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي 3.7اﺳﺖ ﻛﻪ در ﺗﻘﺎﺑﻞ ﺑﺎ ﻣﻘﺪار 4.4در ﻧﺘﺎﻳﺞ ﺗﺼﻮﻳﺮ (b)6.13اﺳﺖ.
ﺑﻪ ﻏﻴﺮ از ﻛﺎﻫﺶ ﺧﻄﺎي ﺑﺎزﺳﺎزي رﻣﺰﮔﺬاري jpeg2000ﻛﻴﻔﻴﺖ ﺗﺼﻮﻳﺮ را ﺑﻪ ﺷﻜﻠﻲ ﺧﺎص ﺑﻬﺒﻮد ﺑﺨﺸﻴﺪه اﺳﺖ .اﻳﻦ ﻣﻮﺿﻮع در ﺗﺼﻮﻳﺮ
(e).6.16ﻣﺸﻬﻮد اﺳﺖ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﺑﺰار ﻗﻄﻌﻪ ﺑﻨﺪي ﻛﻪ در ﻧﺘﺎﻳﺞ ﺗﺒﺪﻳﻞ ﺗﺼﻮﻳﺮ (f).6.13دﻳﺪه ﻣﻲﺷﺪ دﻳﮕﺮ وﺟﻮد ﻧﺪارد.
وﻗﺘﻲ ﺳﻄﺢ ﻓﺸﺮدهﺳﺎزي ﻫﻤﭽﻮن ﺗﺼﻮﻳﺮ (b).6.16ﺑﻪ 88:1ﻣﻲرﺳﺪ ،ﺑﺎﻓﺖ ﻟﺒﺎس زن و ﺗﺎري ﭼﺸﻤﻬﺎﻳﺶ ﻛﺎﻫﺶ ﻣﻲﻳﺎﺑﺪ.
ﻫﺮ 2ﺗﺎﺛﻴﺮ در ﺗﺼﻮﻳﺮﻫﺎي (b).6.16و) (fدﻳﺪه ﻣﻲﺷﻮد .ﺧﻄﺎي rmsاﻳﻦ ﺑﺎزﺳﺎزﻳﻬﺎ در ﺳﻄﻮح ﺧﺎﻛﺴﺘﺮي 5.9اﺳﺖ .ﻧﺘﺎﻳﺞ ﺗﺼﻮﻳﺮ 6.16ﺑﺎ
;)'>> f = imread('Tracy.tif
;)]>> c1 = im2jpegek(f, 5, [8 8.5
;)>> f1 = jpeg2k2im(c1
)>> rms1 = compare(f, f1
= rms1
3.6931
>> cr1 = imratio(f, c1
= cr1
42.1589
;)]>> c2 = jm2jpeg2k(f, f, [8 7
;)>> f2 = jpeg2k2im(c2
)>> rms2 = compare(f, f2
= rms2
5.9172
)>> cr2 = imratio(f, c2
= cr2
87.7323
51
ﺗﺼﻮﻳﺮ .6.16ﺳﺘﻮن ﭼﭗ :ﺷﺒﻴﻪ ﺳﺎزي ﺗﺼﻮﻳﺮ 6.4ﺑﺎ اﺳﺘﻔﺎده از 5ﻣﻘﻴﺎس و ﻛﻤﻲ ﺳﺎزي ﻧﻬﻔﺘﻪ ﺑﺎ
52
وﻗﺘﻲ ﻳﻚ ﺑﺮدار دو ﻋﻨﺼﺮي) (two_elementﺑﻪ ﺻﻮرت ﺷﻨﺎﺳﻪ (agrument3) 3از im2jpeg2kاراﺋﻪ ﻣﻲﺷﻮد ﻛﻤﻲ ﺳﺎزي ﻧﻬﻔﺘﻪ اﻧﺠﺎم
ﻣﻲﺷﻮد .اﮔﺮ ﻃﻮل اﻳﻦ ﺑﺮدار 2ﻧﺒﺎﺷﺪ ،ﻛﻤﻲ ﺳﺎزي ﻧﻬﻔﺘﻪ در ﺗﺎﺑﻊ ﻓﺮض ﻣﻲﺷﻮد و اﻧﺪازه ﻣﺮاﺣﻞ 3 NL +1ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﺷﻮد )در اﻳﻨﺠﺎ NL
ﺗﻌﺪاد ﻣﻘﻴﺎﺳﻬﺎي ﻣﺤﺎﺳﺒﻪ ﺷﺪه اﺳﺖ( .اﻳﻦ ﻣﻘﺪار ﺑﺮاي ﻫﺮ ﻳﻚ از ﺑﺎﻧﺪﻫﺎي ﻓﺮﻋﻲ ﺗﺠﺰﻳﻪ 1اﺳﺖ .آﻧﻬﺎ ﺑﺎﻳﺪ ﺑﺮ اﺳﺎس ﺳﻄﺢ ﺗﺠﺰﻳﻪ و ﻧﻮع ﺑﺎﻧﺪ
ﻓﺮﻋﻲ )ﺑﻪ ﺻﻮرت اﻓﻘﻲ ،ﻋﻤﻮدي ﻳﺎ اري)(bﻣﺮﺗﺐ ﺷﻮﻧﺪ .ﻣﺜﻼً راﺑﻄﻪ زﻳﺮ
;)]>> c3 = im2jpeg2k(f, 1, [1 1 1 1
ﻳﻚ ﺗﺒﺪﻳﻞ ﺗﻚ ﻣﻘﻴﺎﺳﻲ را ﻣﺤﺎﺳﺒﻪ ﻛﺮده و از ﻛﻤﻲ ﺳﺎزي ﻋﻠﻨﻲ ﺑﻬﺮه ﻣﻲﮔﻴﺮد .ﻛﻠﻴﻪ ﭼﻬﺎر ﺑﺎﻧﺪ ﻓﺮﻋﻲ ﺑﺎ اﺳﺘﻔﺎده از ﻣﺮﺣﻠﻪ ∆1=1ﻛﻤﻲ ﺳﺎزي
ﻣﻲﺷﻮﻧﺪ .ﻳﻌﻨﻲ ﺿﺮاﻳﺐ ﺗﺒﺪﻳﻞ ﺑﻪ ﻧﺰدﻳﻜﺘﺮﻳﻦ ﻋﺪد ﺻﺤﻴﺢ ﮔﺮد ﻣﻲﺷﻮﻧﺪ .اﻳﻦ ﺣﺪاﻗﻞ ﺧﻄﺎ را ﺑﺮاي اﺟﺮاي im2jpeg2kاﻳﺠﺎد ﻣﻲﻛﻨﺪ و ﺧﻄﺎي
ﻣﻄﺎﻟﺐ اﻳﻦ ﺑﺨﺶ اﺻﻮل ﻓﺸﺮدهﺳﺎزي ﺗﺼﻮﻳﺮﻫﺎي دﻳﺠﻴﺘﺎﻟﻲ از ﻃﺮﻳﻖ رﻣﺰﮔﺸﺎﻳﻲ و ﺣﺬف اﻓﺰوﻧﮕﻲ رواﻧﻲ – ﺗﺼﻮﻳﺮي و ﺑﻴﻦ ﭘﻴﻜﺴﻠﻲ اﺳﺖ.
روالﻫﺎﻳﻲ ﺑﺮاي ﺣﺬف اﻓﺰوﻧﮕﻲ در ﻧﺮم اﻓﺰار MATLABو ﺗﻮﺳﻌﻪ اﺑﺰار ﭘﺮدازش ﺗﺼﻮﻳﺮ اﺑﺪاع ﺷﺪه اﺳﺖ .ﻣﻌﻴﺎرﻫﺎي اﺳﺘﺎﻧﺪارد ﻓﺸﺮدهﺳﺎزي
ﺗﺼﻮﻳﺮﻫﺎي Jpegو Jpeg2000ﻧﻴﺰ اراﺋﻪ ﺷﺪه اﺳﺖ .ﺑﺮاي ﻛﺴﺐ اﻃﻼﻋﺎت ﺑﻴﺸﺘﺮ در ﺧﺼﻮص ﺣﺬف اﻓﺰوﻧﮕﻲ ﺗﺼﻮﻳﺮﻫﺎ و ﺷﮕﺮدﻫﺎي ﺗﺸﺮﻳﺢ
ﻧﺸﺪه در اﻳﻨﺠﺎ و اﺳﺘﺎﻧﺪاردﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﻣﺠﻤﻮﻋﻪ ﺗﺼﻮﻳﺮﻫﺎي ﻣﺨﺼﻮص )ﻣﺎﻧﻨﺪ ﺗﺼﻮﻳﺮﻫﺎي دودوﻳﻲ( ﻛﻨﻴﺪ.
53