Komputerowe przetwarzanie obrazu Laboratorium 5 Przykład 1 Histogram obrazu a dobór progu binaryzacji. Na podstawie charakterystyki histogramu wybrano dwa różne progi binaryzacji (120 oraz 180). Proszę ocenić rezultaty wykonanych operacji. L1=imread('portret.jpg') imshow(l1) set(gcf,'color',([1 1 1])); grid; imhist(l1); ylabel('ilość pikseli', 'FontSize',15,'FontName','Arial CE') L2a=L1>120; imshow(l2a); L2b=L1>180; imshow(l2b) Przykład 2 Wyznaczenie progu za pomocą algorytmu Otsu. L1=imread('portret.jpg') imshow(l1) set(gcf,'color',([1 1 1])); grid; imhist(l1); ylabel('ilość pikseli', 'FontSize',15,'FontName','Arial CE') level = graythresh(l1); L2 = im2bw(l1,level); imshow(l2) GRAYTHRESH Compute global image threshold using Otsu's method. LEVEL = GRAYTHRESH(I) computes a global threshold (LEVEL) that can be used to convert an intensity image to a binary image with IM2BW. LEVEL is a normalized intensity value that lies in the range [0, 1]. GRAYTHRESH uses Otsu's method, which chooses the threshold to minimize the intraclass variance of the thresholded black and white pixels. Zadanie 1 Proszę wybrać dowolny obraz i na podstawie analizy histogramu spróbować dobrać optymalny próg binaryzacji. Czy dla każdego obrazu jest to możliwe? Następnie dobrać próg przy zastosowaniu algorytmu Otsu. Zadanie 2 Na podstawie analizy histogramu obrazu "cells1.bmp" proszę spróbować wybrać dwa progi (górny i dolny) tak, aby wyróżnić kontury komórek. Ćwiczenie należy wykonać metodą "prób i błędów". Przykład 3 Dodawanie dwóch obrazów monochromatycznych o takiej samej rozdzielczości [L1a,map1a] = imread('gory.bmp'); imshow(l1a,map1a); imshow(ind2gray(l1a,map1a)); L1a=double(ind2gray(L1a,map1a))/255;
imshow(l1b,map1b) imshow(ind2gray(l1b,map1b)); L1b=double(ind2gray(L1b,map1b))/255; L2a=L1a+L1b; imshow(mat2gray(l2a)) MAT2GRAY Convert matrix to intensity image. I = MAT2GRAY(A,[AMIN AMAX]) converts the matrix A to the intensity image I. The returned matrix I contains values in the range 0.0 (black) to 1.0 (full intensity or white). AMIN and AMAX are the values in A that correspond to 0.0 and 1.0 in I. Values less than AMIN become 0.0, and values greater than AMAX become 1.0. I = MAT2GRAY(A) sets the values of AMIN and AMAX to the minimum and maximum values in A. Przykład 4 Dodawanie dwóch obrazów o różnej rozdzielczości: L1a=L1a(201:650,101:700); %wycięcie odpowiedniego fragmentu obrazu imshow(l1b) L2a=L1a+L1b; imshow(mat2gray(l2a)) Uwaga: Jeżeli obrazy różnią się rozmiarami, należy z większego obrazu wyciąć odpowiedni fragment. Przykład 5 Mieszanie obrazów z różną wagą: L1a=L1a(201:650,101:700); imshow(l1b) L2a=imlincomb(0.3,L1a,0.7,L1b); % suma wag dodawanych obrazów musi być równa 1 imshow(l2a) Mieszanie dwóch obrazów z różną wagą (wagi zmieniają się co 1 sekundę: L1a=L1a(201:650,101:700); for i=0:0.05:1 L2=imlincomb(i,L1a,1-i,L1b);
imshow(l2); title(['l1a',mat2str(i*100),'%',' + L1b',mat2str((1- i)*100),'%']); pause(1) end Przykład 6 Funkcja "imadd" pozwala dodać stałą wartość do obrazu lub dodać dwa obrazy do siebie. Dodawanie wartości 80 do obrazu: L1 = imread('portret.jpg'); imshow(l1); L2 = imadd(l1,80); Zadanie 3 Proszę dodać dwa dowolne obrazy za pomocą funkcji "imadd", pamiętając o warunku zgodności wymiarów macierzy. Przykład 7 Odejmowanie dwóch obrazów monochromatycznych (obraz ukryty): L1a=L1a(201:650,101:700)>128; L1c=0.05*double(L1a)/255+0.95*double(L1b)/255; imshow(l1c); L2=mat2gray(L1c-0.95*double(L1b)/255); Zadanie 4 Proszę wykonać odejmowanie dwóch obrazów przy użyciu funkcji "imabsdiff". Następnie zmienić kolejność obrazów źródłowych i zaobserwować czy jest różnica w obrazie wynikowym. Zadanie 5 Proszę wypróbować odejmowanie dwóch obrazów przy użyciu funkcji "imsubtract". Czy zmiana kolejności obrazów źródłowych pociąga za sobą różnicę w obrazie wynikowym? Przykład 8 Mnożenie i dzielenie różnych obrazów ma niewielkie zastosowanie praktyczne. Operacje tego typu mogą być przydatne do odfiltrowywania zbędnej informacji (np: szumu). W fotografii krajobrazowej dalsze plany tracą wyrazistość ze względu na mgłę, która jest widoczna w kanale niebieskim. Mnożenie kanałów zielonego i czerwonego (za pomocą funkcji "immultiply") pozwoli na wyodrębnienie zieleni. L1r=double(L1(:,:,1))/255; imshow(l1r); L1g=double(L1(:,:,2))/255; imshow(l1g); L1b=double(L1(:,:,3))/255; L2=immultiply(L1g,L1r);
imshow(l2,[]); Zadanie 6 Proszę zastosować dzielenie kanału zielonego przez niebieski za pomocą funkcji "imdivide". Przykład 9 Wyznaczanie minimum i maksimum z dwóch obrazów dla każdego z pikseli w odpowiadającym sobie położeniu: L1r=double(L1(:,:,1))/255; imshow(l1r); L1g=double(L1(:,:,2))/255; imshow(l1g); L1b=double(L1(:,:,3))/255; L2a=max(L1g,L1b); L2b=min(L1g,L1b); imshow(l2a); imshow(l2b); Przykład 10 Operacja logiczna NOT dla obrazu binarnego oraz monochromatycznego: L1a=L1>0.5; L2a=~(L1a); imshow(l2a); imshow(bitcmp(uint8(l1*255),8)); Dopełnienie obrazu uzyskane przy zastosowaniu funkcji "imcomplement": imshow(l1); L2=imcomplement(L1); imshow(l2); Sposób 3 Identyczny obraz wynikowy uzyskany przez odwrócenie palety "Grayscale": ('Color', 'w'); imshow(l1); colormap(gray(256)); colorbar; ('Color', 'w'); imshow(l1); colormap(flipud(gray(256))); colorbar;
Przykład 11 Iloczyn logiczny obrazów binarnych: L1a=imread('wykr_10.tif'); imshow(l1a); L1b=imread('wykr_14.tif'); L2=L1a&L1b; L1a=imread('wykr_10.tif'); imshow(l1a); L1b=imread('wykr_14.tif'); L2=bitand(L1a,L1b); Zadanie 7 Bazując na powyższym przykładzie proszę wykonać operacje OR, XOR, SUB. Przykład 12 Iloczyn logiczny obrazów monochromatycznych: L1r=L1(:,:,1); imshow(l1r); L1g=L1(:,:,2); imshow(l1g); L1b=L1(:,:,3); L2=bitand(L1r,L1g);