Những bài tập về xử lý ảnh số có code và minh họa cụ thể với Matlab (môn học Xử lý ảnh - chương trình đào tạo thạc sỹ chuyên ngành Khoa học máy tính)
BÀITẬPXỬLÝẢNHSỐ 1) Lọcảnh(sửdụngphéptươngquan)trênmiềnkhônggian filtered=spatial_filter(image,mask) Trongđóimagelàảnhxámcầnlọc,masklàmặtnạlọc(kíchthướcmỗichiềulàsốlẻ), filteredlàảnhsaukhilọc. Bàilàm: functionloc_anh=spatial_filter(image,mask) clc;closeall; [row_image,colum_image]=size(image); [row_mask,colum_mask]=size(mask); fori=1:row_image+2*floor(row_mask/2) forj=1:colum_image+2*floor(colum_mask/2) loc_anh(i,j)=0; end end fori=1:row_image forj=1:colum_image loc_anh(i+floor(row_mask/2),j+floor(colum_mask/2))=image(i,j); end end fori=1:row_image forj=1:colum_image bientam=0; foru=1:row_mask forv=1:colum_mask bientam=bientam+loc_anh(ifloor(row_mask/2)+u, jfloor(colum_mask/2)+v)*mask(u,v); end end image(i,j)=bientam; end end loc_anh=image; end Thaotác:(tacómatrậnAlàảnhvàmlàmặtnạlọctùyý) >> A=[1 2 3 4 ; 5 6 7 8 ; 9 0 1 2 ] A = 1 2 3 4 5 6 7 8 9 0 1 2 >> m = [0 1 0 ; 1 1 1 ; 0 1 0] m = 0 1 0 1 -4 1 0 1 0 >> loc_anh = spatial_filter(A,m) loc_anh = 3 2 1 -5 -4 -10 -10 -19 -31 16 5 1 2) LọcmộtảnhbấtkỳbằnghàmđãviếtvàsosánhvớikếtquảlọcbằnghàmhỗtrợbởiMatlab(ví dụfspecial,imfilter,…). Bàilàm:CũngvớimatrậnA(ảnhA)tasửdụngvớihàmhỗtrợthìkếtquảvẫnkothayđổi. Nhưngviệcsửdụngcáchàmcósẵnsẽgiúptagiảmthờigianchoviệcviếthàmnhưởcâu1.Ví dụ:tasửdụngfspecial,imfilter,tacó: >>A=[1234;5678;9012] A= 1234 5678 9012 >>m=fspecial('laplacian',0) m= 010 141 010 >>imfilter(A,m) ans=3215 4101019 311651 3) Thựchiệnlọctrungvị,lọcmin,lọcmax,lọcmidpointchomộtảnhxámvớimặtnạlọccókích thướcnnbấtkỳ(nlẻvàn>1). Bàilàm:chọnn=3 function[locmax,locmin,trungvi,midpoint]=locminmax(image,n) clc;closeall; [row_image,colum_image]=size(image); fori=1:row_image+2*floor(n/2) forj=1:colum_image+2*floor(n/2) loc_anh(i,j)=0; end end fori=1:row_image forj=1:colum_image loc_anh(i+floor(n/2),j+floor(n/2))=image(i,j); end end forI=1:row_image forj=1:colum_image max=loc_anh(ifloor(n/2)+1,jfloor(n/2)+1); min=loc_anh(ifloor(n/2)+1,jfloor(n/2)+1); foru=1:n forv=1:n trung_vi(u,v)=loc_anh(ifloor(n/2)+u,jfloor(n/2)+v); ifloc_anh(ifloor(n/2)+u,jfloor(n/2)+v)>max max=loc_anh(ifloor(n/2)+u,jfloor(n/2)+v); end ifloc_anh(ifloor(n/2)+u,jfloor(n/2)+v)<min min=loc_anh(ifloor(n/2)+u,jfloor(n/2)+v); end end end vector=sort(reshape(trung_vi,1,n*n)); trungvi(i,j)=vector(ceil(n*n/2)); locmax(i,j)=max; locmin(i,j)=min; midpoint(i,j)=round((max+min)/2); end end end Thaotác: >>A=[1234;5678;9012] A= 1234 5678 9012 >>m=fspecial('laplacian',0) m= 010 141 010 >>[locmax,locmin,trungvi,midpoint]=locminmax(A,3) locmax= 6788 9988 9988 locmin= 0000 0000 0000 trungvi= 0230 1332 0110 midpoint= 3444 5544 5544 4) Lọctrungbìnhhìnhhọc,trungbìnhHarmonicvàtrungbìnhContraharmonicvớimặtnạlọccó kíchthước33. Bàilàm: function[hinhhoc,har,con]=loctrungbinh(image,q) clc;closeall; [row_image,colum_image]=size(image);n=3; fori=1:row_image+2*floor(n/2) forj=1:colum_image+2*floor(n/2) loc_anh(i,j)=0; end end fori=1:row_image forj=1:colum_image loc_anh(i+floor(n/2),j+floor(n/2))=image(i,j); end end fori=1:row_image forj=1:colum_image bientam=1; s=0; tu=0; mau=0; foru=1:n forv=1:n bientam=bientam+loc_anh(ifloor(n/2)+u, jfloor(n/2)+v); s=s+1/loc_anh(ifloor(n/2)+u,jfloor(n/2)+v); tu=tu+loc_anh(ifloor(n/2)+u,jfloor(n/2)+v)^(q+1); mau=mau+loc_anh(ifloor(n/2)+u,jfloor(n/2)+v)^q; end end hinhhoc(i,j)=bientam*(1/n^2); har(i,j)=n*n/s; con(i,j)=tu/mau; end end end Thaotác:>>A=[1234;5678;9012] A= 1234 5678 9012 >>[hinhhoc,har,con]=loctrungbinh(A,1) hinhhoc= 1.66672.77783.44442.5556 2.66673.88893.77782.8889 2.33333.22222.77782.1111 har= 0000 0000 0000 con= 4.71435.16675.93336.2727 6.39136.05885.54555.7200 7.10006.85716.41676.5556 5) Thựchiệncânbằnghistogramvớiđầuvàolàảnhxám. Bàilàm: functionbai5() clc;closeall; origin=imread('D:\Game\anh\Kayle.jpg'); gray=rgb2gray(origin); hist=histeq(gray); subplot(2,2,1),imshow(gray);title('gray'); subplot(2,2,2),imshow(hist);title('hist'); subplot(2,2,3),imhist(gray);title('histgray'); subplot(2,2,4),imhist(hist);title('histogram'); end 6) CắtngưỡngtựđộngdựatrênthuậttoáncắtngưỡngOtsu. Bàilàm: functionbai6() clc;closeall; origin=imread('D:\Game\anh\Kayle.jpg') subplot(1,2,1); imshow(origin),title('Orgin'); laynguong=graythresh(origin); BlackWhite=im2bw(origin,laynguong); subplot(1,2,2); imshow(BlackWhite),title('CatnguongtudongOtsu'); end 7) Hiểnthị8látmặtbitcủamộtảnhxám. Bàilàm: functionbai7() clc;closeall; origin=imread('D:\Game\anh\Kayle.jpg'); gray=rgb2gray(origin); subplot(3,3,1),imshow(gray),title('gray'); bit1=bitget(gray,1)*2^0; subplot(3,3,2),imshow(bit1,[]),title('bit1'); bit2=bitget(gray,2)*2^1; subplot(3,3,3),imshow(bit2,[]),title('bit2'); bit3=bitget(gray,3)*2^2; subplot(3,3,4),imshow(bit3,[]),title('bit3'); bit4=bitget(gray,4)*2^3; subplot(3,3,5),imshow(bit4,[]),title('bit4'); bit5=bitget(gray,5)*2^4; subplot(3,3,6),imshow(bit5,[]),title('bit5'); bit6=bitget(gray,6)*2^5; subplot(3,3,7),imshow(bit6,[]),title('bit6'); bit7=bitget(gray,7)*2^6; subplot(3,3,8),imshow(bit7,[]),title('bit7'); bit8=bitget(gray,8)*2^7; subplot(3,3,9),imshow(bit8,[]),title('bit8'); end 8) Thựchiệncácthaotácerosion,dilation,opening,closing. Bàilàm: functionbai8() clc;closeall; origin=imread('D:\Game\anh\Kayle.jpg'); gray=rgb2gray(origin); blackwhite=im2bw(gray,graythresh(gray)); erosion=imerode(blackwhite,[0,1,0;1,1,1;0,1,0]); subplot(3,2,1),imshow(origin),title('origin'); subplot(3,2,2),imshow(blackwhite),title('BlackWhite'); subplot(3,2,3),imshow(erosion),title('erosion'); dilation=imdilate(blackwhite,[0,1,0;1,1,1;0,1,0]); subplot(3,2,4),imshow(dilation),title('dilation'); closing=imclose(blackwhite,[0,1,0;1,1,1;0,1,0]); subplot(3,2,5),imshow(closing),title('closing'); opening=imopen(blackwhite,[0,1,0;1,1,1;0,1,0]); subplot(3,2,6),imshow(opening),title('opening'); end 9) ViếthàmMatlabthựchiệntuầntựcácchứcnăngsau: ● Đọcmộtảnhmàuvàobiếnoriginvàchuyểnsangảnhxám(gánvàobiếngray). ● Táchriêngtừngkênhmàu(R,G,B)củaảnhorigin. ● ThựchiệnlọctrungvịchotừngkênhmàuR,G,B. ● TạoảnhmàuRGBcótênrgb_filteredtừkếtquảlọc3kênhmàuởtrên. ● Thựchiệnlọctrungvịchoảnhxámgray,gánkếtquảvàobiếngray_filtered. ● Hiểnthịđộsaikháctạimỗiđiểmảnhgiữaảnhxámcủaảnhrgb_filteredvàgray_filtered. Bàilàm: functiond=bai9(file) clc;closeall; origin=imread('D:\Game\anh\Kayle.jpg'); subplot(3,2,1),imshow(origin),title('origin'); gray=rgb2gray(origin); subplot(3,2,2),imshow(gray),title('gray'); kenhR=origin(:,:,1); subplot(3,2,3),imshow(kenhR),title('Red'); kenhG=origin(:,:,2); subplot(3,2,4),imshow(kenhG),title('Green'); kenhB=origin(:,:,3); subplot(3,2,5),imshow(kenhB),title('Blue'); trungviR=medfilt2(kenhR,[33]); trungviG=medfilt2(kenhG,[33]); trungviB=medfilt2(kenhB,[33]); rgb_filtered=cat(3,trungviR,trungviG,trungviB); gray_filtered=medfilt2(gray,[33]); gray_RGB=rgb2gray(rgb_filtered); d=abs(gray_RGBgray_filtered); subplot(3,2,6),imshow(d,[]),title('saikhac'); end ViếtchươngtrìnhMatlabthựchiệnnhậndạngmộtđốitượngtùyý(1chữcái,chữsố,vậtthể bấtkỳ,…) Bàilàm: NhậnDạngKhuônMặt *Matlab2013cóhàmhỗtrợnhậndạngkhuônmặt.tacóthểsửdụnghàmhỗtrợnàynhưsau: functionbai10() %Example1:Facedetection % faceDetector=vision.CascadeObjectDetector();%Default:findsfaces Origin=imread('path_image\.jpg'); bboxes=step(faceDetector,Origin);%Detectfaces %Annotatedetectedfaces IFaces=insertObjectAnnotation(Origin,'rectangle',bboxes,'Face'); figure,imshow(IFaces),title('Detectedfaces'); end *Ýtưởngthựchiệnviếtchươngtrình(khôngsửdụnghàmhỗtrợ): Sơđồkhốichobàitoán Tạo1cơsởdữliệugồmnảnh,mỗiảnhđượcđặttêntheothứtựlàcácsónguyêntừ1đếnn đểtiệnchoviệcquảnlýtậpảnhnày(ntùyvàosốlượngảnh). Ảnhđượcđưavàotậpcơsởdữliệusẽđượcdùngđểhuấnluyện,từđâysửdụngcácphương pháptríchrútđặctrưngvàđưaravectođặctrưngchoviệcnhậndạng. [...]...Khi đưa ảnh cần nhận dạng vào ta thực hiện tính tọa độ hình chiếu của ảnh này và của cả những ảnh trong cơ sở dữ liệu đã có, rồi đem so sánh kết quả Thực hiện đo khoảng cách (khoảng cách Euclid) giữa tọa độ hình chiếu của ảnh cần kiểm tra với tọa độ hình chiếu của các ảnh trong cơ sở dữ liệu. Bức ảnh nào trong cơ sở dữ liệu có khoảng cách so với ảnh cần kiểm tra là ngắn nhất thì ta chọn . BÀITẬPXỬLÝ ẢNH SỐ 1) Lọc ảnh (sửdụngphéptươngquan)trênmiềnkhônggian filtered=spatial_filter(image,mask) Trongđóimagelà ảnh xámcầnlọc,masklàmặtnạlọc(kíchthướcmỗichiềulà số lẻ), filteredlà ảnh saukhilọc. Bài làm: functionloc_anh=spatial_filter(image,mask) clc;closeall; [row_image,colum_image]=size(image); [row_mask,colum_mask]=size(mask); fori=1:row_image+2*floor(row_mask/2) forj=1:colum_image+2*floor(colum_mask/2) loc_anh(i,j)=0; end end fori=1:row_image forj=1:colum_image loc_anh(i+floor(row_mask/2),j+floor(colum_mask/2))=image(i,j); end end fori=1:row_image forj=1:colum_image bientam=0; foru=1:row_mask forv=1:colum_mask bientam=bientam+loc_anh(ifloor(row_mask/2)+u, jfloor(colum_mask/2)+v)*mask(u,v); end end image(i,j)=bientam; end end loc_anh=image; end Thaotác:(tacómatrậnAlà ảnh vàmlàmặtnạlọctùyý) >>. NhậnDạngKhuônMặt *Matlab2013cóhàmhỗtrợnhậndạngkhuônmặt.tacóthểsửdụnghàmhỗtrợnàynhưsau: functionbai10() %Example1:Facedetection % faceDetector=vision.CascadeObjectDetector();%Default:findsfaces Origin=imread('path_image.jpg'); bboxes=step(faceDetector,Origin);%Detectfaces %Annotatedetectedfaces IFaces=insertObjectAnnotation(Origin,'rectangle',bboxes,'Face'); figure,imshow(IFaces),title('Detectedfaces'); end *Ýtưởngthựchiệnviếtchươngtrình(khôngsửdụnghàmhỗtrợ): Sơđồkhốicho bài toán Tạo1cơsởdữliệugồmn ảnh, mỗi ảnh đượcđặttêntheothứtựlàcácsónguyêntừ1đếnn đểtiệnchoviệcquản lý tập ảnh này(ntùyvào số lượng ảnh) . Ảnh đượcđưavào tập cơsởdữliệusẽđượcdùngđểhuấnluyện,từđâysửdụngcácphương pháptríchrútđặctrưngvàđưaravectođặctrưngchoviệcnhậndạng. Khiđưa ảnh cầnnhậndạngvàotathựchiệntínhtọađộhìnhchiếucủa ảnh nàyvàcủacảnhững ảnh trongcơsởdữliệuđãcó,rồiđemsosánhkếtquả. Thựchiệnđokhoảngcách(khoảngcáchEuclid)giữatọađộhìnhchiếucủa ảnh cầnkiểmtra vớitọađộhìnhchiếucủacác ảnh trongcơsởdữliệu.Bức ảnh nàotrongcơsởdữliệucókhoảngcách sovới ảnh cầnkiểmtralàngắnnhấtthìtachọn.