Aralık 2008 için arşiv
Dışbükey çokgen (convex hull) bulma ve çokgenin içinde noktalar oluşturma
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
İlgin (affine) dönüşümler: Ölçekleme, Döndürme ve Öteleme
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ş')
Altıgen ızgara oluşturma
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
Verilen bir Dizindeki Asv Uzantılı Dosyaları Silme
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
Dairesel Permütasyon Operatörü
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 );
Bir tane mi yerel maksimum var, yoksa daha çok mu?
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/
Bir dizindeki tüm resimleri toplu halde ölçekleme (yeniden boyutlandırma)
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)
Mandelbrot Kümesi
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));
Bir Resimdeki Bit Tabakalarını Çizdirme
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
Bir Fonksiyonda, Verilen Değişik Parametre Sayısına ve Sınıf Tiplerine Göre İşlem Yapma
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



