Gereksinimler ve Ön Hazırlık
Java ile görüntü işleme projelerine başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. En az Java 17 veya 21 LTS (Long Term Support) sürümünü kullanmanız önerilir. Ayrıca, görüntüleri okumak ve yazmak için standart javax.imageio paketinden yararlanacağız.
- JDK: Java 17 veya üzeri.
- IDE: IntelliJ IDEA, Eclipse veya VS Code.
- Temel Bilgi: Java sınıfları ve döngü yapıları hakkında temel düzeyde bilgi.
Projenizi oluştururken herhangi bir dış bağımlılığa (harici kütüphane) ihtiyaç duymadan, Java'nın kendi çekirdek (core) kütüphaneleriyle başlayacağız. Bu, kodunuzun taşınabilirliğini artırır ve gereksiz bağımlılık yükünden kurtarır.
Adım 1: Resim Dosyasını Yükleme ve Okuma
Resim işleme sürecinin ilk adımı, yerel diskteki bir görseli Java nesnesine dönüştürmektir. Bunun için ImageIO sınıfını kullanırız. Bu sınıf, farklı formatlardaki (JPG, PNG, BMP) dosyaları BufferedImage nesnesine dönüştürür.
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ResimYukleyici {
public static BufferedImage resmiYukle(String dosyaYolu) throws IOException {
File dosya = new File(dosyaYolu);
return ImageIO.read(dosya);
}
}
Yukarıdaki kod bloğu, verilen dosya yolundan resmi okur. Hata yönetimi (exception handling) için IOException fırlatılması, dosyanın bulunamaması veya formatın desteklenmemesi durumunda uygulamanın çökmesini engeller.
Adım 2: Resim Üzerinde Piksel Bazlı İşlem Yapma
Resimler, aslında bir renk değerleri matrisidir. Bir resme filtre uygulamak, aslında bu matrisin her bir pikselinin RGB (Kırmızı, Yeşil, Mavi) değerlerini matematiksel bir işlemden geçirmek demektir. Örneğin, bir resmi gri tonlamaya (grayscale) çevirmek için piksellerin ortalama parlaklığını buluruz.
public static BufferedImage griTonlamaFiltresi(BufferedImage kaynak) {
int genislik = kaynak.getWidth();
int yukseklik = kaynak.getHeight();
BufferedImage sonuc = new BufferedImage(genislik, yukseklik, BufferedImage.TYPE_INT_RGB);
for (int y = 0; y < yukseklik; y++) {
for (int x = 0; x < genislik; x++) {
int p = kaynak.getRGB(x, y);
int a = (p >> 24) & 0xff;
int r = (p >> 16) & 0xff;
int g = (p >> 8) & 0xff;
int b = p & 0xff;
int ortalama = (r + g + b) / 3;
int yeniP = (a
Konvolüsyon Matrisleri ile Gelişmiş Filtreleme
Piksel bazlı basit işlemlerin ötesine geçmek istediğinizde, görüntü işleme dünyasında Konvolüsyon (Convolution) yöntemine başvurulur. Bu yöntem, bir çekirdek (kernel) matrisini resmin her bir pikseli üzerinde gezdirerek komşu piksellerle matematiksel bir etkileşime sokar. Bu sayede bulanıklaştırma (blur), keskinleştirme (sharpen) veya kenar bulma (edge detection) gibi karmaşık filtreler oluşturulabilir.
Aşağıdaki örnek, 3x3'lük bir matris kullanarak resme basit bir "Keskinleştirme" (Sharpen) filtresi uygulayan mantığı göstermektedir:
public static BufferedImage keskinlestirmeFiltresi(BufferedImage kaynak) {
int genislik = kaynak.getWidth();
int yukseklik = kaynak.getHeight();
BufferedImage sonuc = new BufferedImage(genislik, yukseklik, BufferedImage.TYPE_INT_RGB);
// Keskinleştirme matrisi (kernel)
float[] matris = {
0, -1, 0,
-1, 5, -1,
0, -1, 0
};
for (int y = 1; y < yukseklik - 1; y++) {
for (int x = 1; x < genislik - 1; x++) {
int r = 0, g = 0, b = 0;
// 3x3 komşuluk matrisini tara
for (int ky = -1; ky 16) & 0xff) * matris[(ky + 1) * 3 + (kx + 1)];
g += ((p >> 8) & 0xff) * matris[(ky + 1) * 3 + (kx + 1)];
b += (p & 0xff) * matris[(ky + 1) * 3 + (kx + 1)];
}
}
// Değerleri 0-255 aralığında tut
r = Math.min(Math.max(r, 0), 255);
g = Math.min(Math.max(g, 0), 255);
b = Math.min(Math.max(b, 0), 255);
sonuc.setRGB(x, y, (r


Yorumlar (0)
Yorum Yaz