INCES Source Code

% Gauss filtering for determining Region-of-Interest on Medical Images
% Hüseyin Bilal MACİT
%% Tanımlamalar--------------------------------------------------------
clc;
global I; % Görüntü
imge='D:\works\legs.png';
I = imread(imge); 
I=rgb2gray(I);

[m,n,p] = size(I);
pixelcount=64; % Bir blokta yatay ve dikeyde kaç piksel var
% Kapak görüntü satır ve sütun genişliğini blok büyüklüğüne göre değiştir
while(mod(m,pixelcount)>0)
    m = m - 1;
end;
while(mod(n,pixelcount)>0)
    n = n - 1;
end;

I = imresize(I,[m n]);

% Verilen veri boyutuna göre damgalama için kaç blok gerekli?
veriboyutu=131072; %(bit say˝s˝)
GBS = ceil(veriboyutu/(pixelcount*pixelcount)) 

% Satır ve sütunun bölünebileceği blok sayısı ve blok boyutunun belirlenmesi

GaussSD = 2; % Gauss filtresinde uygulanacak standart sapma 
mbs=m/pixelcount; % yatay blok sayısı
nbs=n/pixelcount; % dikey blok sayısı

Blocks = cell(mbs,nbs); % Katman blok

% SSIM hesaplaması sonrasındaki değerler için gerekli matrisleri tanımla
GSSIM=[];

%% Görüntüyü  bloklara ayırma işlemi
counti = 0;
for i = 1:pixelcount:m-(pixelcount-1)
   counti = counti + 1;
   countj = 0;
   for j = 1:pixelcount:(n-(pixelcount-1))
        countj = countj + 1;
         Blocks{counti,countj} = I(i:i+(pixelcount-1),j:j+(pixelcount-1));         
   end
end

%% Gauss hesaplaması -----------------------------------------------------------

% her bloğa Gauss uygula ve SSIM hesapla
for i = 1:1:mbs
    for j = 1:1:nbs
        GaussBlocks{i,j} = imgaussfilt(Blocks{i,j},GaussSD);
        GSSIM(i,j)=ssim(GaussBlocks{i,j},Blocks{i,j});          
    end
end

%% Uygun blokların tespit edilmesi
UB=zeros(mbs,nbs);

ShowBlocks = zeros(mbs,nbs);
for i=1:1:mbs
    maxDeger=0;    
    for j=1:1:nbs
        if GSSIM(i,j)>maxDeger
            maxDeger=GSSIM(i,j);
        end
    end
    for j=1:1:nbs
        % Bu satırdaki en büyük SSIM değerine sahip blok tespit ediliyor
        if GSSIM(i,j)>=maxDeger
            maxDeger=GSSIM(i,j);            
            ShowBlocks(i,j)=1;
            %for k=1:1:j-1 % Bundan önceki bloklarda seçilen varsa siliniyor.
            %    ShowBlocks(i,k)=0;
           %end
        end
    end
end
%figure;
%imshow(ShowBlocks);

% Sonuçların yeni matrise aktarımı
for i=1:1:mbs
    for j=1:1:nbs
        if ShowBlocks(i,j)>=1 
            UB(i,j)=1;
        end
    end
end

% Her sütunun maksimumu
ShowBlocks = zeros(mbs,nbs);
for j=1:1:nbs
    maxDeger=0;
    for i=1:1:mbs
        if GSSIM(i,j)>maxDeger
            maxDeger=GSSIM(i,j);
        end
    end
    for i=1:1:mbs
        % Bu satırdaki en büyük SSIM değerine sahip blok tespit ediliyor
        if GSSIM(i,j)>=maxDeger
            maxDeger=GSSIM(i,j);            
            ShowBlocks(i,j)=1;   
        end
    end
end

% Sonuçların yeni matrise aktarımı
for i=1:1:mbs
    for j=1:1:nbs
        if ShowBlocks(i,j)>=1
            UB(i,j)=1;
        end
    end
end

% Her iki taramanın sonucunda ortaya çıkan bloklar
Show=UB; [x1,y1]=size(Show);
Show=imresize(Show, [x1*30 y1*30], 'nearest');
figure; imshow(Show);

%% UB matrisinde damgalanacak bölgenin hesaplanması
% UB tek sayılı boyutta hesaplanmalıdır. 
if mod(mbs,2)==0
    nmbs=mbs-1;
else nmbs=mbs;
end

if mod(nbs,2)==0
    nnbs=nbs-1;
else nnbs=nbs;
end

% UB kendisinin dörtte biri büyüklüğünde bir özellik matrisine evrilir.
hesap=[];k=1;l=1;
for i=1:2:(nmbs-2)    
    for j=1:2:(nnbs-2)
        hesap(k,l)=(UB(i,j)+UB(i+1,j)+UB(i,j+1)+UB(i+1,j+1))/4;
        l=l+1;
    end
    k=k+1;
    l=1;
end

% hesap tek sayılı boyutta hesaplanmalıdır. 

nnbs=floor(nnbs/2);
nmbs=floor(nmbs/2);
% UB sürekli kendisinin dörtte biri büyüklüğünde bir özellik matrisine evrilir.
hesap2=[];k=1;l=1;
for i=1:2:nmbs-2    
    for j=1:2:nnbs-2
        hesap2(k,l)=(hesap(i,j)+hesap(i+1,j)+hesap(i,j+1)+hesap(i+1,j+1))/4;
        l=l+1;
    end
    k=k+1;
    l=1;
end

% Bölgenin seçimi için hesap2 matrisinden kaç hücreye ihtiyaç var?

GBS = ceil(GBS/16);
[mm,nn]=size(hesap2);

 
    enBuyuk=max(max(hesap2));
    for i=1:1:mm
        for j=1:1:nn            
            if  (hesap2(i,j)>=enBuyuk) && (GBS>0)
                GBS=GBS-1;
                hesap2(i,j)=0;     
                for t=((4*i)-3):1:(4*i)
                    for v=((4*j)-3):1:(4*j)
                        for t1=1:1:pixelcount
                            for t2=1:1:pixelcount
                                if (mod(t1,2)==0) && (mod(t2,2)==0)
                                    Blocks{t,v}(t1,t2)=255;  
                                end
                            end
                        end                        
                    end
                end                   
            end
        end
    end    
    
%% Blokları birleştirip yeniden görüntü oluştur ve ekrana çiz --------------------

BRow = 1;
BCol = 1;
PRow = 1;
PCol = 1;
for i=1:1:m
    BCol = 1;
    for j=1:1:n
        noi = mod(i,pixelcount);
        noj = mod(j,pixelcount);
        if (noi==0)
            noi=pixelcount;
        end
        if (noj==0)
            noj=pixelcount;
        end
        N(i,j)=Blocks{BRow,BCol}(noi,noj);
        if (mod(j,pixelcount)==0) 
            BCol = BCol + 1;
        end
    end
    if (mod(i,pixelcount)==0) 
       BRow = BRow + 1;
    end
end

figure;
imshow(N);title('imge');
imwrite(N,'D:\Works\Result.png');