ZSO   - Úloha č.5                                                                                                    Jiří Filip

Segmentace obrazu pomocí prahování a pomocí Houghovy transformace



Úkol:
Segmentujte obraz do dvou oblastí. Obraz byl velmi poškozen Gaussovským šumem. Původní obraz obsahoval dvě oblasti s konstantním
jasem. Oblasti byly rozděleny přímkou.

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).



Původní obraz:

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
                                                                                                                                              



Výpis programu v MATLABu:
function rozdel(jmeno_souboru,prah,rozmer_filtru);%do prametru i rozmer filtru potom
close all;
switch(nargin)   %definice chybejicich argumentu, ktere jsou nahrazeny beznymi hodnotami
  case 0
  jmeno_souboru='';
  prah=-100;   % prah -100 znamena ze si ho zadame rucne mysi
  rozmer_filtru=20;
  case 1
  prah=-100;
  rozmer_filtru=20;
  case 2
  rozmer_filtru=20;
end

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;



ZSO - úloha č.5                                                                                                                                      10.12.1999  Jiří Filip