ismailari.com

İsmail Arı'nın anasayfası

Aralık 2008 için arşiv

Dışbükey çokgen (convex hull) bulma ve çokgenin içinde noktalar oluşturma

Yorum yapılmadı

Açıklama: Köşe noktaları verilen bir şeklin dışbükey çokgeninin (convex hull) içinde istenilen sayıda rastgele nokta oluşturma ve bunları çizdirme.

Şekil bilgisine sahip olduğumuz ve içinde örnek noktalar oluşturmak istediğimiz bir alanda kullanılabilir. Örneğin, genelde renk veya deri sezimi yaparken önce resimlerde rengi/cildi kapsayan köşegenler bulunur, daha sonra içindeki tüm noktalar işleme tabi tutulur. Bu zaman açısından çok masraflı olur. Onun yerine bu kod ile rastgele noktalar bulunup onlarla eğitim yapılabilir. Tabii rand(1,1) kısmının şeklin içinde olması ihtimalini arttırmak için o değeri şeklin en alçak ve en yüksek koordinat değerlerinin arasına taşımak gerekli.

English description: Finding the convex hull of the given vertices and creating sample points inside this convex hull.

Kaynak kod

% createRandomPointsInsideAPolygon.m: Köşe noktaları verilen bir şeklin
% dışbükey çokgeninin (convex hull) içinde istenilen sayıda rastgele nokta
% oluşturma ve bunları çizdirme

clear, clc

% Şeklin köşelerinin x ve y koordinatlarini belirleyelim.
xVertices = rand(20,1);
yVertices = rand(20,1);

% Kaç tane rastgele nokta istiyoruz
numPoints = 1000;

% Verdiğimiz noktaların dışbükey çokgenini bulalım
k = convhull(xVertices,yVertices);
xPolygonVertices = xVertices(k);
yPolygonVertices = yVertices(k);

% 'numPoints' kadar noktanın x ve y koordinatlarını bulacağız
x = zeros(numPoints,1);
y = zeros(numPoints,1);
for i = 1:numPoints
    isIn = 0;
    while ~isIn % Çokgenin içine düşene kadar dene
        x(i) = rand(1,1);
        y(i) = rand(1,1);
        isIn = inpolygon(x(i),y(i),xPolygonVertices,yPolygonVertices);
        % Kullanım: inpolygon(noktanın x koordinatı, y koordinatı,0 ...
        %              çokgenin köşelerinin x koordinatları, y koordinatları)
    end
end

plot(xVertices, yVertices, 'o', 'Linewidth',2)
hold on
plot(xPolygonVertices,yPolygonVertices,x,y,'r+')
hold off
legend('Şekil noktaları','Dışbükey çokgen', 'Rastgele bulunan noktalar')
shg % Çizim penceresini göster

31 Aralık 2008, Kategori: Programlama, Etiketler:

İlgin (affine) dönüşümler: Ölçekleme, Döndürme ve Öteleme

Yorum yapılmadı

Açıklama: İlgin (affine) dönüşümler: ölçekleme, döndürme ve öteleme. Bu dönüşümlere Öklid veya benzerlik (similarity) dönüşümleri de denir.

İşlemlerde öncelikle maketform‘a tanım kümesinden (girdi uzayı) değer kümesine (çıktı uzayı) dönüşüm yapacak matrisi sağlayarak başlayacağız.

% Her iki yönde de 2 kat ölçekleme yap
A = [2 0 0; 0 2 0; 0 0 1];
tform = maketform('affine', A);

Daha sonra tformfwd ile dönüşüm sonucu oluşacak değerleri bulacağız. (x,y) noktaları tanımlanan noktalar, (u,v) ise hedef noktalar olsun.

xy = [2 3];
uv = tformfwd(tform, xy)
uv =

4     6

Bulunan noktalardan geri dönüşüm yapmak istersek de tforminv fonksiyonunu kullanabiliriz.

xyp = tforminv(tform, uv)
xyp =

2     3

Daha ayrıntılı örnekler kodda mevcut.

Kaynak: Steve on Image Processing, Spatial transformations: maketform, tformfwd, and tforminv

English description: Similarity transformations using MATLAB

Kaynak kod

% affineTransformations.m: Matlab ile İlgin (affine) dönüşümler: Ölçekleme,
% Döndürme ve Öteleme

% ANLATIM

% İşlemlerde öncelikle maketform'a tanım kümesinden (girdi uzayı) değer
% kümesine (çıktı uzayı) dönüşüm yapacak matrisi sağlayarak başlayacağız.
%    A = [2 0 0; 0 2 0; 0 0 1];  % Her iki yönde de 2 kat ölçekleme yap
%    tform = maketform('affine', A);
% Daha sonra tformfwd ile dönüşüm sonucu oluşacak değerleri bulacağız.
% (x,y) noktaları tanımlanan noktalar, (u,v) ise hedef noktalar olsun.
%    xy = [2 3];
%    uv = tformfwd(tform, xy)
%    uv =
%
%     4     6
%
% Bulunan noktalardan geri dönüşüm yapmak istersek de tforminv fonksiyonunu
% kullanabiliriz.
%    xyp = tforminv(tform, uv)
%    xyp =
%
%      2     3

% ÖRNEKLER

% Önce dönüşüme sokacağımız şekli çizelim: basir bir ev olsun
x = [-0.6 -0.6 0.6  0.6 -0.9  0    0.9  0.6]';
y = [-0.2  0.8 0.8 -0.2 -0.2 -0.8 -0.2 -0.2]';

% plot(x,y), axis ij, axis equal, axis([-1 1 -1 1]), grid on

% Ölçekleme: yatay yönde 1.5 kat, dikey yönde 2 kat
A1 = [1.5 0 0; 0 2 0; 0 0 1];
tform1 = maketform('affine', A1);
uv1 = tformfwd(tform1, [x y]);

subplot(2,2,1)
plot(x,y), axis ij, axis equal, axis([-2 2 -2 2]), grid on, title('Ev')

subplot(2,2,3)
plot(uv1(:,1), uv1(:,2)), axis ij, axis equal, axis([-2 2 -2 2])
grid on
title('Yatay yönde 1.5 kat, dikey yönde 2 kat ölçeklendikten sonra')

% Döndürme: 45 derece
% Dikkat: y ekseni yukarı değil aşağı yönde artıyor.
theta = pi/4;
A2 = [cos(theta) sin(theta) 0; -sin(theta) cos(theta) 0; 0 0 1];
tform2 = maketform('affine', A2);
uv2 = tformfwd(tform2, [x y]);

subplot(2,2,2)
plot(uv2(:,1), uv2(:,2)), axis ij, axis equal, axis([-2 2 -2 2])
grid on
title('45\circ döndükten sonra')

% Öteleme: yatay yönde 1, dikey yönde -1
A3 = [1 0 0; 0 1 0; 1 -1 1];
tform3 = maketform('affine', A3);
uv3 = tformfwd(tform3, [x y]);

subplot(2,2,4)
plot(uv3(:,1), uv3(:,2)), axis ij, axis equal, axis([-2 2 -2 2])
grid on
title('Yatay yönde 1, dikey yönde -1 ötelenmiş')

30 Aralık 2008, Kategori: Programlama, Etiketler:

Altıgen ızgara oluşturma

Yorum yapılmadı

Açıklama: Altıgen ızgara oluşturma.

Girdiler: xStepSize -> Izgaranın x yönündeki artış miktarı (y buna bağımlıdır), axesBounds -> [minX maxX minY maxY] olarak sınırlar

Çıktılar : X -> Izgaranın x koordinatları. Y -> Izgaranın y koordinatları

Örnek:

minX = 100; minY = 250; maxX = 640; maxY = 480;
[X,Y] = makeHexGrid(20, [minX  maxX minY maxY]);
plot(X,Y,'r.')
axis([minX-50 maxX+50 minY-50 maxY+50])
axis equal

Not: MATLAB’da meshgrid komutu ile kare veya dikdörtgen ızgaralar oluşturulabilir.

English description: Creating hexagonal grid within the given bounds and step size on x axis.

Kaynak kod

% makeHexGrid.m: Altıgen ızgara oluşturma
%
% Girdiler: xStepSize -> Izgaranın x yönündeki artış miktarı (y buna bağımlıdır)
%        axesBounds -> [minX maxX minY maxY] olarak sınırlar
%
% Çıktılar : X -> Izgaranın x koordinatları
%            Y -> Izgaranın y koordinatları
%
% Örnek:
%   minX = 100; minY = 250; maxX = 640; maxY = 480;
%   [X,Y] = makeHexGrid(20, [minX  maxX minY maxY]);
%   plot(X,Y,'r.')
%   axis([minX-50 maxX+50 minY-50 maxY+50])
%   axis equal
%

function [X,Y] = makeHexGrid(xStepSize, axesBounds)

% Eger sadece x artış miktarı verilirse çizim sınırlarını varsayılanlara
% atayalım
if nargin < 2
    axesBounds = [0 0 10 10];
end

minX = axesBounds(1);
maxX = axesBounds(2);
minY = axesBounds(3);
maxY = axesBounds(4);

X = []; Y = []; % çıktılar

% Altıgen ızgara yapacağımız için y eksenindeki artış miktarı x' e bağımlı
% olacak ve cos(pi/6) katı olacak
yStepSize = xStepSize * cos(pi/6);

row = 1;
for yVal = minY:yStepSize:maxY
    isOddRow = mod(row,2);
    if isOddRow
        xStart = minX;
    else
        % Çift satırlarda x değerleri artış miktarının sin(pi/6),
        %  yani 0.5 katı içerisinden başlar
        xStart = minX + xStepSize / 2;
    end
    xList = xStart:xStepSize:maxX;
    yList = yVal * ones(size(xList)); % Her x değerine karşılık bir y değeri
    X = [X; xList(:)];
    Y = [Y; yList(:)];
    row = row + 1;
end

30 Aralık 2008, Kategori: Programlama, Etiketler:

Verilen bir Dizindeki Asv Uzantılı Dosyaları Silme

Yorum yapılmadı

Açıklama: MATLAB ile çalışırken, otomatik olarak .asv dosyalarının oluştuğunu görürsünüz. Bunları temizlemek için elle yapmak yerine bu kod kullanılabilir. Koddaki folder değişkeni değiştirilerek istenilen dizin ve onun alt-dizinlerindeki .asv uzantılı dosyalar silinir.

Kaynak kod

% MATLAB'deki oto-kayıt (.asv) dosyalarını silme.
% Altta "folder" ile tanımlanan yerdeki dizin ve onun alt-
% dizinlerini dahil ederek .asv dosyalarını bulur ve siler.

% Önce ortamı temizleyelim
clear, clc

rehash path % Dosya konumlarını yenileyelim

folder = '.'; % Bulunduğumuz dizinden itibaren olsun

% Alt dizinleri bul
folders = genpath([pwd filesep folder]);
folders = regexp(folders, ';', 'split');

% Bulunan dizinlerdeki .asv dosyalarını bul
asvFiles = cell(0);
for iFolder = 1:numel(folders)
     files = dir(fullfile(folders{iFolder},'*.asv'));
     nFiles = numel(files);
     for iFile = 1:nFiles
          asvFiles{end+1} = [folders{iFolder} filesep files(iFile).name];
     end
end

% .asv dosyalarını diskten sil
for iAsvFile = 1:numel(asvFiles)
     delete(asvFiles{iAsvFile});
end

30 Aralık 2008, Kategori: Programlama, Etiketler:

Dairesel Permütasyon Operatörü

Yorum yapılmadı

Girdiler: x -> İşlenecek dizi, a -> kaç eleman öteleme yapılacağı

Çıktı: y -> x dizisinin a kadar dairesel olarak ötelenmiş hali

Örnek: x = [1 2 3 4 5 6], a = 2 olursa; C(x,a), x‘in 2 eleman sağa kaymış hali olur, yani [3 4 5 6 1 2]

Kaynak kod

% Dairesel Permutasyon Operatoru
%
% Girdiler: x -> Islenecek dizi,
%           a -> kac eleman oteleme yapilacagi
% Cikti:    y -> "x" dizisinin "a" kadar dairesel olarak otelenmis hali
%
% Ornek: x = [1 2 3 4 5 6], a = 2 olursa
%        C(x,a) = x'in 2 eleman saga kaymis hali olur, yani [3 4 5 6 1 2]

function [y] = C(x,a)
    N = length(x);
    n = 1:N;
    y(n) = x( mod( mod( n+a,N )-1, N ) + 1 );

30 Aralık 2008, Kategori: Programlama, Etiketler:

Bir tane mi yerel maksimum var, yoksa daha çok mu?

Yorum yapılmadı

Açıklama: Elimizde bir M matrisi olsun. Örneğin 3×3′lük komşulukta (pencereler) ile matrisin elemanları üzerinde geziyoruz ve bu pencere içindeki en yüksek değerleri buluyoruz. O hücreye ait en yüksek tek değer mi vardır, yoksa daha çok mu?

Kaynak kod

% uniquenessOfLocalExtremum: Bir tane mi yerel maksimum var, yoksa daha çok
% mu?

% ANLATIM
% Elimizde bir M matrisi olsun. Örneğin 3x3'lük komşulukta (pencereler) ile
% matrisin elemanları üzerinde geziyoruz ve bu pencere içindeki en yüksek
% değerleri buluyoruz. O hücreye ait en yüksek tek değer mi vardır, yoksa
% daha çok mu?

% Önce bir matrisimiz olmalı (bu gri bir resim de olabilirdi)

M = [7 24  1  8 15
    23  5  7 14 16
     4  6 13 22 22
    10 12 19 21  3
    11 18 25  2  9];

% Aklımızda bulunsun: imdilate ile 3x3'lük 1 matrisi kullanımı o
% komşuluktaki en yüksek değeri verir, ama biz başka bir yöntem kullanalım. 

highest = imdilate(M, ones(3,3));

% En yüksekten bir tane mi var? sorusuna cevap verebilmek için en
% yüksekleri ve en yüksek ikincileri bulup karşılaştırmak yeterli
% olacaktır.
% ordfilt2 2 boyutta istatistiksel sıralama yapar
% kullanım: ordfilt2(matris,kaçıncısı,bakılacak alan)

highest = ordfilt2(M, 9, ones(3,3));
secondHighest = ordfilt2(M, 8, ones(3,3));
nonUniqueMaximaMask = (highest == secondHighest);

% Not: Buna benzer olarak minimumlar için olanı da yapılabilirdi.
% ordfilt2'in ikinci parametreleri 1 ve 2 olacaktı.

% Kaynak:
% http://blogs.mathworks.com/steve/2006/04/10/quick-tip-determining-uniquen
% ess-of-neighborhood-maximum/

30 Aralık 2008, Kategori: Programlama, Etiketler:

Bir dizindeki tüm resimleri toplu halde ölçekleme (yeniden boyutlandırma)

Yorum yapılmadı

Açıklama: 'resimlerim' klasöründeki tüm '.jpg','.gif','.png' uzantılı resimleri en uzun boyutu 120px olacak şekilde ve ‘jpg’ formatında kaydeder ve eski resimleri siler.

Bağımlılık: #1 ve #2 kullanılarak yapılmıştır.

Girdi ve Çıktı: Yok

Önce: 'resimlerim' klasöründeki'.jpg','.gif','.png' uzantılı resimler bulunuyor.

Sonra:: 'resimlerim' klasöründeki tüm orijinal '.jpg','.gif','.png' uzantılı resimler silindi, tüm resimler için aynı orantıda fakat en uzun boyutu 120 px olacak şekilde küçük ‘jpg’ resimler yaratıldı.

English description: Batch processing of images in a directory to create thumbnails using Python.

Kaynak kod

"""
'resimlerim' klasorundeki tum '.jpg','.gif','.png' uzantili resimleri
en uzun boyutu 120px olacak sekilde ve 'jpg' formatinda kaydeder
ve eski resimleri siler.
"""
import Image
import os

# Buraya #5'teki resizeImage ve #13'teki listDirectory
#  fonksiyonlarini yerlestiriniz.

def processImage(imageName):
    img = Image.open(imageName) # resmi acalim
    # en yuksen izin verilen en ve boy degerini girelim
    maxWidth = 120
    maxHeight = 120
    # yeni resmin uzantisi jpg olsun
    saveExt = '.jpg'
    # resmi boyutlandiralim
    if img.size[0] > maxWidth:
        img = resizeImage(img, 'width', maxWidth)
    if img.size[1] > maxHeight:
        img = resizeImage(img, 'height', maxHeight)
    # kaydedelim
    img.save(os.path.splitext(imageName)[0] + saveExt)
    # eger ustune kaydetmemissek (yani uzantisi degismisse), eskisini silelim
    if os.path.splitext(imageName)[1] != saveExt:
        os.remove(imageName)

if __name__ == '__main__':
    directory = 'resimlerim'
    exts = ['.jpg','.gif','.png']
    imageNames = listDirectory(directory, exts)
    for imageName in imageNames:
        processImage(imageName)

30 Aralık 2008, Kategori: Programlama, Etiketler:

Mandelbrot Kümesi

Yorum yapılmadı

Açıklama: Mandelbrot fraktal kümesinin resmini çıkarır.

Girdiler: en -> istenilen resmin eni, boy -> istenilen resmin boyu

Çıktı: img -> Mandelbrot kümesinin verilen en ve boya ait resmi

Örnek:

% 600x400 boyutunda resim olusturalim
imgem = mandelbrot(600,400);
imshow(imgem)
colormap copper % bakir renginde cizdirelim

Mandelbrot kümesi hakkında daha ayrıntılı bilgi için Matematik Dünyası‘nın 2007-IV sayısının 81. sayfasına bakabilirsiniz.

Kaynak kod

% mandelbrot.m: Mandelbrot fraktal kumesinin resmini cikarir
%
% Girdiler: en -> istenilen resmin eni
%           boy -> istenilen resmin boyu
% Cikti:    img -> Verilen en ve boya ait Mandelbrot kumesi resmi
%
% Ornek: imgem = mandelbrot(600,400); % 600x400 boyutunda resim dondursun
%        imshow(imgem)
%        colormap copper % bakir renginde cizdirelim
%

function img = mandelbrot(en, boy)
x = linspace(-2.1,1.1,en); % x ekseninde [-2,1] arasini 'en' parcaya bol
y = linspace(-1.2,1.2,boy); % y ekseninde [-1,1] arasını 'boy' parcaya bol
[X,Y] = meshgrid(x,y); % Izgara koordinat degerlerini cikar
Z = zeros(boy, en);
C = X + i*Y;
for k = 1:20; % 20 dongu kullanalim
Z=Z.^2+C;
end
img = exp(-abs(Z));

30 Aralık 2008, Kategori: Programlama, Etiketler:

Bir Resimdeki Bit Tabakalarını Çizdirme

Yorum yapılmadı

Açıklama: Verilen resimdeki bit tabakalarını çizer.

Girdi: img -> Renkli veya gri seviye resim

Çıktı: Yok

Örnek:

% Diskten bir resim okuyalim
imgem = imread('test_resmim.png');
bitTabakalariniGoster(imgem)

Kaynak kod

% bitTabakalariniGoster.m: Verilen resimdeki bit tabakalarini cizer
%
% Girdi: img -> Renkli veya gri seviye resim
% Cikti: Yok
%
% Ornek: imgem = imread('test_resmim.png'); % Diskten bir resim okuyalim
%        bitTabakalariniGoster(imgem)
% 

function bitTabakalariniGoster(img)
% Gelen resim renkli (RGB) ise griye cevirelim
if size(img, 3) == 3
    imgGri = rgb2gray(img);
end

% Resmin formatini 0-255 arasi tam degerlere donusturelim
imgGri = im2uint8(imgGri);

k = 128; % 8 bitlik dusunursek 128 == 10000000, yani en onemli biti 1, digerleri 0

for b = 1:8 % En soldakinden/onemliden baslayarak her bir bit icin
    subplot(2, 4, b); % Cizilecek hucreyi sec

    imgBit = bitand(imgGri, k); % Resim ile k'yi bit bit ve operatorunden gecir
    imgBit = im2bw(imgBit, 0); % 0 Olmayan yerler beyaz olsun, 0'lar siyah.

    imshow(imgBit)
    title(['Onem sirasina gore ' int2str(b) '. bit tabakasi'])

    k = k/2; % Sagdaki bite atla
end

30 Aralık 2008, Kategori: Programlama, Etiketler:

Bir Fonksiyonda, Verilen Değişik Parametre Sayısına ve Sınıf Tiplerine Göre İşlem Yapma

Yorum yapılmadı

Açıklama:

Değişken argüman/girdi sayısına ve değişkenlerin türüne göre işlem yapmaya dair temel ornek.

MATLAB’da çalışırken girilecek parametre sayısını sabitlemek istemezsek fonksiyon’a girdi parametresi olarak varargin yazilir. nargin ise kaç adet parametre verildiğini gösterir.

Girdiler:

varargin -> Herhangi bir sayıdaki girdi

Çıktı:

Yok

Örnek:

argumentHandling(1 ,[5 8],2+5i,'abc',{1,'def'}, ...
logical(2==5), uint8(5))

Ekran çıktısı:

--> 1. girdinin sinifi: double
Degeri: 1
--> 2. girdinin sinifi: double
Degeri: 5  8
--> 3. girdinin sinifi: double
Degeri: 2+5i
--> 4. girdinin sinifi: char
Degeri: abc
--> 5. girdinin sinifi: cell
Hucre tipinin deger gosterimi pas gecildi.
--> 6. girdinin sinifi: logical
Degeri: Yanlis
--> 7. girdinin sinifi: uint8
Tanimlanmayan tipin deger gosterimi pas gecildi.

Kaynak kod

% argumentHandling.m: Degisken arguman/girdi sayisina  ve degiskenlerin
% turune gore islem yapmaya dair temel ornek.
%
% MATLAB'da calisirken girilecek parametre sayisini sabitlemek
% istemezsek fonksiyon'a girdi parametresi olarak varargin yazilir. nargin
% ise kac adet parametre verildigini gosterir.
%
% Girdiler: varargin -> Herhangi bir sayidaki girdi
%
% Cikti: Yok
%
% Ornek:
%   argumentHandling(1 ,[5 8],2+5i,'abc',{1,'def'},logical(2==5), uint8(5))
% 

function argumentHandling( varargin )

display([int2str(nargin) ' adet parametre girdiniz.'])

for i = 1:nargin
    display(['--> ' int2str(i) '. girdinin sinifi: ' class(varargin{i})])

    % Sinifina gore muamele :)
    switch class(varargin{i})
        case 'double'
            display(['    Degeri: ' num2str(varargin{i})])
        case 'char'
            display(['    Degeri: ' varargin{i}])
        case 'logical'
            if varargin{i}, deger = 'Dogru';, else, deger = 'Yanlis';, end
            display(['    Degeri: ' deger])
        case 'cell'
            display(['    Hucre tipinin deger gosterimi pas gecildi.'])
        otherwise
            display(['    Tanimlanmayan tipin deger gosterimi pas gecildi.'])
    end
end



29 Aralık 2008, Kategori: Programlama, Etiketler: