Merhaba arkadaşlar..
Bir başka projede birlikteyiz :) Bu projede farklı miktarlardaki bozuk paraları (1TL, 25Kr, 50Kr..) görüntü işleme algoritmalarını kullanarak sayma işlemi gerçekleştireceğiz. Görüntü olarak 'para.jpg' yi kullandık.
Daha önceki 'Resim Üzerindeki Nesneleri Bulma' yazımda resimdeki nesnelerin nasıl belirlendiğini ve bu nesnelerin kaç adet olduğunu size anlatmıştım. Burdaki mantığı kullanarak para sayma işlemini yapacağız.
Bu adımları sıralayacak olursak;
İlk olarak resmimizi okuma işlemi ile başlıyoruz.
Resmimizi okuduktan sonra önce gri-tona çevirip (2D) sonra Binary (Siyah-Beyaz) formata çeviriyoruz. Çünkü diğer işlemler için görüntü binary modda olması lazım.
Bu adımda doldurma (fill) ve gereksiz bileşenlerin kaldırılması yapılacaktır.
imcomplement: binary modda siyah alanlar beyaz, beyaz alanlar siyaha çevrilir. Bu kodu eklememizdeki amaç imfill komutunu hatasız kullanabilmemiz içindir. İmfill komutunu hatasız kullanmak için nesnelerimiz beyaz arkaplan beyaz olması gerekmektedir.
Bu bölümde resmimize morfolojik filtreler uyguluyoruz. Öncelikle strel dairesel bir yapısal element olusturup imerode komutu ile aşındırma işlemi yapıyoruz. Bunu yapmamızdaki amaç yapışık olan paraların ayırmaktır. Böylece daha düzgün sonuçlar alabiliriz.
Resmimizle ilgili ön hazırlık bitmiştir. Resmimiz hazır haldedir. Bundan sonra asıl komutlara geçeceğiz.
bwboundaries komutu ile para adetini öğrenip döngüye sokup her paranın alanlarını öğreniyoruz ve bu alanlara göre paralarının tanımını yapıp toplam parayı ekrana yansıtıyoruz.
Evet arkadaşlar projemiz tamamlanmıştır.Yardımcı olabilmişimdir İnşallah :) Özet olarak resmimizi bir önişlemden gerçiriyoruz hazır hale geldikten sonra asıl kodları yazıyoruz. Önişlemde kullanılan komutların altyapısını yani teorisini iyi öğrenmenizi tavsiye ederim. Bilmediğiniz komutları üstteki arama bölümüne yazarak sitede bulabilirsiniz.
Projemizin tam kodu aşağıdaki gibidir.
Bir başka projede birlikteyiz :) Bu projede farklı miktarlardaki bozuk paraları (1TL, 25Kr, 50Kr..) görüntü işleme algoritmalarını kullanarak sayma işlemi gerçekleştireceğiz. Görüntü olarak 'para.jpg' yi kullandık.
Daha önceki 'Resim Üzerindeki Nesneleri Bulma' yazımda resimdeki nesnelerin nasıl belirlendiğini ve bu nesnelerin kaç adet olduğunu size anlatmıştım. Burdaki mantığı kullanarak para sayma işlemini yapacağız.
Bu adımları sıralayacak olursak;
- 1.Adım olarak, resmi okuma işlemini gerçekleştirmiştik.
- 2.Adım olarak, öncelikle resmi gri tona yani 2 boyuta döndürmemiz ve şekilleri belirlemeye yardımcı olması için resmi tamamen binary hale getirmemiz gerekiyordu.
- 3.Adım olarak, görüntüdeki bağımsız bileşenleri kaldırmamız gerekiyordu bunun için morfolojik işlemler uyguluyorduk.
- 4.Adım olarak, nesnelerin sınırlarını buluyorduk. (Bu uygulamada gerek yok.)
- 5.Adım olarak ise nesnelerin alanlarını hesaplıyorduk.
İlk olarak resmimizi okuma işlemi ile başlıyoruz.
clc;
clear all;
imageorj=imread('C:\para.jpg'); %Resmimizi okuyoruz.
figure(1),imshow(imageorj);
Şekil-1 |
image=rgb2gray(imageorj); %Resmimizi gri tona çeviriyoruz. (2-Boyut)
level=graythresh(image);
bw=im2bw(image,level);
figure(2),imshow(bw);
Şekil-2 |
Bu adımda doldurma (fill) ve gereksiz bileşenlerin kaldırılması yapılacaktır.
imcomplement: binary modda siyah alanlar beyaz, beyaz alanlar siyaha çevrilir. Bu kodu eklememizdeki amaç imfill komutunu hatasız kullanabilmemiz içindir. İmfill komutunu hatasız kullanmak için nesnelerimiz beyaz arkaplan beyaz olması gerekmektedir.
bw=imcomplement(bw); %Resmi negatiflik ekliyoruz.
figure(3),imshow(bw)
bw=imfill(bw,'holes');%Resimde çukur diye nitelendirilen yerleri dolduruyoruz.
bw = bwareaopen(bw,30);%30px den daha az sayıda olan nesneler kaldırılıyor.
figure(4),imshow(bw);
Şekil-3 |
Şekil-4 |
se=strel('disk',11); %Yarıçapı 11px olan disk biçiminde yapısal element oluşturuyoruz.
bw2=imerode(bw,se); %Birlesik madeni paralarin ayrilmasi saglaniyor.
figure(5),imshow(bw2);
Şekil-5 |
bwboundaries komutu ile para adetini öğrenip döngüye sokup her paranın alanlarını öğreniyoruz ve bu alanlara göre paralarının tanımını yapıp toplam parayı ekrana yansıtıyoruz.
[B,L] = bwboundaries(bw2); % length(B) ile para adetini ogrendik ve etiket atadik
stats = regionprops(bw2, 'Area','Centroid');
figure(6),imshow(imageorj);
toplam = 0;
for n=1:length(B)
a=stats(n).Area; % Her paranın alanını öğrendik. Boyutlara göre hesaplama yaptık.
centroid=stats(n).Centroid;
if a> 1200
toplam = toplam + 1;
text(centroid(1),centroid(2),'1TL');
elseif a >800 && a < 1050
toplam = toplam + 0.5;
text(centroid(1),centroid(2),'50Kr');
elseif a >500 && a < 650
toplam = toplam + 0.25;
text(centroid(1),centroid(2),'25Kr');
elseif a > 360 && a < 380
toplam = toplam + 0.10;
text(centroid(1),centroid(2),'10Kr');
else
toplam = toplam + 0.05;
text(centroid(1),centroid(2),'5Kr');
end
end
title(['Toplam para miktari = ',num2str(toplam),' TL'])
Şekil-6 |
Projemizin tam kodu aşağıdaki gibidir.
clc;
clear all;
imageorj=imread('C:\para.jpg'); %Resmimizi okuyoruz.
figure(1),imshow(imageorj);
image=rgb2gray(imageorj); %Resmimizi gri tona çeviriyoruz. (2-Boyut)
level=graythresh(image);
bw=im2bw(image,level);
figure(2),imshow(bw);
bw=imcomplement(bw); %Resmi negatiflik ekliyoruz.
figure(3),imshow(bw)
bw=imfill(bw,'holes');%Resimde çukur diye nitelendirilen yerleri dolduruyoruz.
bw = bwareaopen(bw,30);%30px den daha az sayıda olan nesneler kaldırılıyor.
figure(4),imshow(bw);
se=strel('disk',11); %Yarıçapı 11px olan disk biçiminde yapısal element oluşturuyoruz.
bw2=imerode(bw,se); %Birlesik madeni paralarin ayrilmasi saglaniyor.
figure(5),imshow(bw2);
[B,L] = bwboundaries(bw2); % length(B) ile para adetini ogrendik ve etiket atadik
stats = regionprops(bw2, 'Area','Centroid');
figure(6),imshow(imageorj);
toplam = 0;
for n=1:length(B)
a=stats(n).Area; % Her paranın alanını öğrendik. Boyutlara göre hesaplama yaptık.
centroid=stats(n).Centroid;
if a> 1200
toplam = toplam + 1;
text(centroid(1),centroid(2),'1TL');
elseif a >800 && a < 1050
toplam = toplam + 0.5;
text(centroid(1),centroid(2),'50Kr');
elseif a >500 && a < 650
toplam = toplam + 0.25;
text(centroid(1),centroid(2),'25Kr');
elseif a > 360 && a < 380
toplam = toplam + 0.10;
text(centroid(1),centroid(2),'10Kr');
else
toplam = toplam + 0.05;
text(centroid(1),centroid(2),'5Kr');
end
end
title(['Toplam para miktari = ',num2str(toplam),' TL'])