সিম্পল থ্রেশোল্ডিং এবং Otsu’s থ্রেশোল্ডিং
থ্রেশোল্ডিং একটি মৌলিক এবং গুরুত্বপূর্ণ ইমেজ প্রসেসিং টেকনিক যা একটি গ্রেস্কেল ইমেজ থেকে পিক্সেলগুলির মধ্যে সীমারেখা (boundary) চিহ্নিত করে। থ্রেশোল্ডিংয়ের মাধ্যমে, আমরা চিত্রের মধ্যে কোনো নির্দিষ্ট রঙের (বা উজ্জ্বলতা) স্তরের ভিত্তিতে পিক্সেলগুলোকে দুটি শ্রেণীতে ভাগ করতে পারি: যেমন foreground (প্রধান বিষয়) এবং background (পটভূমি)। এটি প্রধানত বাইনারি ইমেজ তৈরি করতে ব্যবহৃত হয়, যেখানে পিক্সেলগুলি দুটি মান (সাদা এবং কালো) ধারণ করে।
এখানে দুটি প্রধান থ্রেশোল্ডিং টেকনিক নিয়ে আলোচনা করা হয়েছে:
- সিম্পল থ্রেশোল্ডিং (Simple Thresholding)
- Otsu's থ্রেশোল্ডিং (Otsu's Thresholding)
১. সিম্পল থ্রেশোল্ডিং (Simple Thresholding)
বর্ণনা: সিম্পল থ্রেশোল্ডিং হল একটি মৌলিক থ্রেশোল্ডিং পদ্ধতি যেখানে একটি নির্দিষ্ট থ্রেশোল্ড মান নির্ধারণ করা হয়। এরপর, ইমেজের প্রতিটি পিক্সেলের উজ্জ্বলতা বা গ্রেস্কেল ভ্যালু এই থ্রেশোল্ড মানের সাথে তুলনা করা হয়। যদি পিক্সেলের মান থ্রেশোল্ডের চেয়ে বেশি হয়, তবে সেই পিক্সেলটি 255 (সাদা) হিসাবে সেট করা হয়, এবং যদি কম হয়, তবে সেটি 0 (কালো) হিসাবে সেট করা হয়।
ফর্মুলা:
\[
T(x, y) =
\begin{cases}
255 & \text{if } I(x, y) > T \
0 & \text{if } I(x, y) \leq T
\end{cases}
\]
- যেখানে, \( I(x, y) \) হল পিক্সেলের ইনপুট গ্রেস্কেল মান, \( T \) হল থ্রেশোল্ড মান, এবং \( T(x, y) \) হল আউটপুট পিক্সেল (বাইনারি মান)।
Java কোড (Simple Thresholding):
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class SimpleThresholding {
public static void main(String[] args) {
try {
// ইমেজ লোড করা
BufferedImage image = ImageIO.read(new File("path/to/your/image.jpg"));
int width = image.getWidth();
int height = image.getHeight();
int threshold = 128; // থ্রেশোল্ড মান (0-255)
// বাইনারি ইমেজ তৈরি করা
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int pixel = image.getRGB(i, j);
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = pixel & 0xff;
// গ্রেস্কেল মান গণনা
int gray = (int)(0.299 * red + 0.587 * green + 0.114 * blue);
// থ্রেশোল্ডিং প্রয়োগ
if (gray > threshold) {
image.setRGB(i, j, 0xFFFFFF); // সাদা
} else {
image.setRGB(i, j, 0x000000); // কালো
}
}
}
// ফলস্বরূপ বাইনারি ইমেজ সংরক্ষণ করা
ImageIO.write(image, "jpg", new File("path/to/save/binary_image.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
}২. Otsu’s থ্রেশোল্ডিং (Otsu's Thresholding)
বর্ণনা: Otsu’s থ্রেশোল্ডিং একটি স্বয়ংক্রিয় থ্রেশোল্ডিং টেকনিক যা ছবির ইতিহাস (histogram) থেকে সেরা থ্রেশোল্ড মান খুঁজে বের করে। এটি একটি অ্যালগরিদম যা দুটি ক্লাসের মধ্যে সর্বোচ্চ ভ্যারিয়েন্স (inter-class variance) খোঁজে এবং তার মাধ্যমে একটি উপযুক্ত থ্রেশোল্ড মান নির্ধারণ করে। এটি মূলত সিম্পল থ্রেশোল্ডিংয়ের তুলনায় আরও কার্যকরী, বিশেষত যখন ছবির উজ্জ্বলতা বা কনট্রাস্টে অনেক পার্থক্য থাকে।
Otsu's থ্রেশোল্ডিং ফর্মুলা:
- Histogram তৈরি করুন এবং তারপরে প্রতিটি থ্রেশোল্ডের জন্য intra-class variance এবং inter-class variance গণনা করুন।
- Otsu’s criterion অনুসারে, সেরা থ্রেশোল্ড \( T \) হবে যেখানে inter-class variance সর্বাধিক হবে।
Java কোড (Otsu’s Thresholding):
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class OtsuThresholding {
public static void main(String[] args) {
try {
// ইমেজ লোড করা
BufferedImage image = ImageIO.read(new File("path/to/your/image.jpg"));
int width = image.getWidth();
int height = image.getHeight();
// হিস্টোগ্রাম তৈরি করা
int[] histogram = new int[256];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int pixel = image.getRGB(i, j);
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = pixel & 0xff;
int gray = (int)(0.299 * red + 0.587 * green + 0.114 * blue);
histogram[gray]++;
}
}
// Otsu’s Thresholding অনুসারে থ্রেশোল্ড খুঁজে বের করা
int totalPixels = width * height;
float sumTotal = 0;
for (int i = 0; i < 256; i++) {
sumTotal += i * histogram[i];
}
float sumBackground = 0;
int weightBackground = 0;
int weightForeground = 0;
float maxVariance = 0;
int threshold = 0;
for (int t = 0; t < 256; t++) {
weightBackground += histogram[t];
if (weightBackground == 0) continue;
weightForeground = totalPixels - weightBackground;
if (weightForeground == 0) break;
sumBackground += (float) (t * histogram[t]);
float meanBackground = sumBackground / weightBackground;
float meanForeground = (sumTotal - sumBackground) / weightForeground;
float betweenClassVariance = weightBackground * weightForeground * (meanBackground - meanForeground) * (meanBackground - meanForeground);
if (betweenClassVariance > maxVariance) {
maxVariance = betweenClassVariance;
threshold = t;
}
}
// Otsu’s থ্রেশোল্ড মান প্রয়োগ করা
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int pixel = image.getRGB(i, j);
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = pixel & 0xff;
int gray = (int)(0.299 * red + 0.587 * green + 0.114 * blue);
if (gray > threshold) {
image.setRGB(i, j, 0xFFFFFF); // সাদা
} else {
image.setRGB(i, j, 0x000000); // কালো
}
}
}
// ফলস্বরূপ বাইনারি ইমেজ সংরক্ষণ
ImageIO.write(image, "jpg", new File("path/to/save/otsu_image.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
}সারসংক্ষেপ:
- সিম্পল থ্রেশোল্ডিং:
- এটি সহজতম থ্রেশোল্ডিং পদ্ধতি, যেখানে একটি নির্দিষ্ট থ্রেশোল্ড মান ব্যবহার করে পিক্সেলগুলিকে বাইনারি ক্লাসে বিভক্ত করা হয় (সাদা এবং কালো)।
- Otsu's থ্রেশোল্ডিং:
- এটি একটি উন্নত থ্রেশোল্ডিং পদ্ধতি যা ইমেজের হিস্টোগ্রাম বিশ্লেষণ করে সেরা থ্রেশোল্ড মান খুঁজে বের করে, যা ইমেজের সঠিক ভ্যালু বিভাজন নিশ্চিত করে।
যেখানে সিম্পল থ্রেশোল্ড
িং সহজ এবং দ্রুত কাজ করে, সেখানে Otsu's থ্রেশোল্ডিং বেশি কার্যকরী যখন ইমেজের উজ্জ্বলতা বা কনট্রাস্টের অনেক পার্থক্য থাকে।