ZSO - Úloha č.5 Jiří FilipSegmentace obrazu pomocí prahování a pomocí Houghovy transformace
Součástí odevzdání bude:
1.Segmentovaný obraz.
Čili obraz s rozdílně obarvenými regiony.
2.Počty pixelů v jednotlivých
oblastech (velikost oblasti).
Segmentace pomocí histogramu
TIF
TIF - hrana získaná prahováním histogramu
původní obrázek po filtraci
bílá=57% 9867 pixelů
černá=43% 7446 pixelů
Výsledek Radonovy transformace
Segmentace pomocí nalezení dělící
přímky
TIF
TIF - hrana získaná radon. transf. po Cannyho filtraci
hrana nalezená Cannyho detektorem
bílá=57% 9867 pixelů
černá=43% 7446 pixelů
TIF
TIF
čára proložená RADONovou transformací
a její zobrazení v původním obrazu
puvodni_obrazek=double(imread(jmeno_souboru))/255;
%nacteni obrazku
prvni_okno=figure('Units','normalized','Position',[0.5
0 0.5 0.5]); %umisteni okna
clf;
%smazani okna
subplot(221);
%2x2
imshow(puvodni_obrazek);
xlabel('Puvodni obrazek');
%podtrzitko dela dolni index
subplot(223);
plot(imhist(puvodni_obrazek));
%histogram puvodniho obrazku
xlabel('A jeho histogram');
maska = fspecial('Gaussian',rozmer_filtru,9);
%vypocet masky filtru
filtrovany_obrazek = filter2(maska,puvodni_obrazek,'same');
%prvni filtrovani
filtrovany_obrazek = filter2(maska,filtrovany_obrazek,'valid');%pri
druhem orezu okraje
filtrovany_obrazek = filtrovany_obrazek/max(max(filtrovany_obrazek));
%upraveni jasu do mezi
subplot(222);
imshow(filtrovany_obrazek);
xlabel('Filtrovany obrazek');
subplot(224);
plot(imhist(filtrovany_obrazek));
%histogram filtrovaneho obrazku
xlabel('A jeho histogram');
if(prah==(-100))
%volba prahu mysi
[prah,xxxxx]=ginput;
%hledani prahu
end;
rozdeleny_obrazek=filtrovany_obrazek;
%Rozdeleni prahem
rozdeleny_obrazek(filtrovany_obrazek>prah/255)=1;
%svetlo
rozdeleny_obrazek(filtrovany_obrazek<=prah/255)=0;
%tma
subplot(221);
imshow(rozdeleny_obrazek);
mnozstvi_bile = sum(rozdeleny_obrazek(:));
%spocitani mnozstvi jednicek a nul
mnozstvi_cerne = size(rozdeleny_obrazek,1)*size(rozdeleny_obrazek,2)-mnozstvi_bile;
celkove_mnozstvi=(mnozstvi_bile+mnozstvi_cerne)*0.01;%
prepocet na procenta
xlabel(sprintf(' bila=%2.0f%%
%d pixelu\n cerna=%2.0f%% %d pixelu',
(mnozstvi_bile/celkove_mnozstvi),mnozstvi_bile,
(mnozstvi_cerne/celkove_mnozstvi),mnozstvi_cerne));
druhe_okno=figure('Units','normalized','Position',[0
0 0.5 0.5]);
E = edge(filtrovany_obrazek,'canny');
%hledani hrany Cannym
subplot(221);
imshow(E);
xlabel('Hrana nalezena Cannym');
theta = (0:179)';
%matice vsech pocitanych uhlu
[R,xp] = radon(E,theta);
%Radonovo hledani primky
treti_okno=figure('Units','normalized','Position',[0.5
0.5 0.5 0.4]);%Zobrazeni Radona
imagesc(theta,xp,R), colorbar;
xlabel ('theta (deg)'), ylabel
('rho (pixels from center)')
title('Line Space');
figure(druhe_okno);
subplot(222);
[radek,sloupec] = find(R==max(R(:)))
%nalezeni maxima => primka hledana
d=xp(radek)
%vyzvednuti vzdalenosti primky od pocatku
alfa=(theta(sloupec)).*(pi./180);
%a vyzvednuti uhlu
rozmer_x=size(puvodni_obrazek,2);
%Pocitani mezi do cyklu
rozmer_y=size(puvodni_obrazek,1);
%
polovina_x=floor(rozmer_x/2);
% chyba je jeden bod
polovina_y=floor(rozmer_y/2);
%
zbytek_x=rozmer_x-polovina_x;
%Pro liche pridej -1
zbytek_y=rozmer_y-polovina_y-1;
%Pro liche pridej -1
mapa_cary=zeros(size(puvodni_obrazek)); %priprava matice
for x=-polovina_x:zbytek_x;
%pro vsechny body spoctu vse
for y=-polovina_y:zbytek_y;
%a dozvim se kde lezi moje body
mapa_cary(1+zbytek_y-y,1+x+zbytek_x)=((x*cos(alfa)+y*sin(alfa)-d)>0);
end;
end;
imshow(mapa_cary);
%tisk
mnozstvi_bile = sum(mapa_cary(:));
mnozstvi_cerne = size(mapa_cary,1)*size(mapa_cary,2)-mnozstvi_bile;
celkove_mnozstvi=(mnozstvi_bile+mnozstvi_cerne)*0.01;
xlabel(sprintf(' bila=%2.0f%%
%d pixelu\n cerna=%2.0f%% %d pixelu',
(mnozstvi_bile/celkove_mnozstvi),mnozstvi_bile,
(mnozstvi_cerne/celkove_mnozstvi),mnozstvi_cerne));
mapa_cary=[];
%priprava
mapa_cary=zeros(size(puvodni_obrazek));
for x=-polovina_x:zbytek_x;
%pocitam caru ze smeru X
y=round((d-x*cos(alfa))/sin(alfa));
if(y<zbytek_y)
if(y>(-polovina_y))
mapa_cary(1+zbytek_y-y,1+x+zbytek_x)=0.5;
end
end
end;
for y=-polovina_y:zbytek_y;
%pridam jeste pohled ze smeru y
x=round((d-y*sin(alfa))/cos(alfa));
if(x<zbytek_x)
if(x>(-polovina_x))
mapa_cary(1+zbytek_y-y,1+x+zbytek_x)=1;
end
end
end;
subplot(223);
imshow(mapa_cary);
xlabel('Cara prolozena Radonem');
subplot(224);
barevny_puvodni_obrazek(:,:,1)=puvodni_obrazek;
%udelame z cernobileho barevny
barevny_puvodni_obrazek(:,:,2)=puvodni_obrazek;
%v sede.
barevny_puvodni_obrazek(:,:,3)=puvodni_obrazek;
%
barevna_mapa_cary(:,:,2)=mapa_cary;
%zelena nam zaroven definuje velikost matice
barevna_mapa_cary(:,:,1)=mapa_cary*2;
barevna_mapa_cary(:,:,3)=mapa_cary*3;%kde
bude trojka nebo dvojka tak to vynuluj
barevny_puvodni_obrazek(barevna_mapa_cary==1)=1;
%zelenou barvu na maximum
barevny_puvodni_obrazek(barevna_mapa_cary==2)=0;
% modrou na nulu
barevny_puvodni_obrazek(barevna_mapa_cary==3)=0;
% a cervenou taky na nulu
imshow(barevny_puvodni_obrazek);
xlabel('Puvodni obraz s nalez.
hranou');
return;